xref: /llvm-project/clang/test/Analysis/cert/env34-c-cert-examples.c (revision b98a594977f25e555822e5ceef457f69c73cce45)
1f7a46d70SEndre Fülöp // Default options.
2811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1                                                      \
3*b98a5949SEndre Fülöp // RUN:  -analyzer-checker=core,security.cert.env.InvalidPtr                    \
4811b1736SZurab Tsinadze // RUN:  -verify -Wno-unused %s
5f7a46d70SEndre Fülöp //
6f7a46d70SEndre Fülöp // Test the laxer handling of getenv function (this is the default).
7f7a46d70SEndre Fülöp // RUN: %clang_analyze_cc1                                                      \
8*b98a5949SEndre Fülöp // RUN:  -analyzer-checker=core,security.cert.env.InvalidPtr                    \
9*b98a5949SEndre Fülöp // RUN:  -analyzer-config security.cert.env.InvalidPtr:InvalidatingGetEnv=false \
10f7a46d70SEndre Fülöp // RUN:  -verify -Wno-unused %s
11f7a46d70SEndre Fülöp //
12f7a46d70SEndre Fülöp // Test the stricter handling of getenv function.
13f7a46d70SEndre Fülöp // RUN: %clang_analyze_cc1                                                      \
14*b98a5949SEndre Fülöp // RUN:  -analyzer-checker=core,security.cert.env.InvalidPtr                    \
15*b98a5949SEndre Fülöp // RUN:  -analyzer-config security.cert.env.InvalidPtr:InvalidatingGetEnv=true  \
16f7a46d70SEndre Fülöp // RUN:  -verify=expected,pedantic -Wno-unused %s
17811b1736SZurab Tsinadze 
18811b1736SZurab Tsinadze #include "../Inputs/system-header-simulator.h"
19811b1736SZurab Tsinadze char *getenv(const char *name);
20f7a46d70SEndre Fülöp int setenv(const char *name, const char *value, int overwrite);
21811b1736SZurab Tsinadze int strcmp(const char*, const char*);
22811b1736SZurab Tsinadze char *strdup(const char*);
23811b1736SZurab Tsinadze void free(void *memblock);
24811b1736SZurab Tsinadze void *malloc(size_t size);
25811b1736SZurab Tsinadze 
incorrect_usage_setenv_getenv_invalidation(void)26f7a46d70SEndre Fülöp void incorrect_usage_setenv_getenv_invalidation(void) {
27811b1736SZurab Tsinadze   char *tmpvar;
28811b1736SZurab Tsinadze   char *tempvar;
29811b1736SZurab Tsinadze 
30811b1736SZurab Tsinadze   tmpvar = getenv("TMP");
31811b1736SZurab Tsinadze 
32811b1736SZurab Tsinadze   if (!tmpvar)
33811b1736SZurab Tsinadze     return;
34811b1736SZurab Tsinadze 
35f7a46d70SEndre Fülöp   setenv("TEMP", "", 1); //setenv can invalidate env
36f7a46d70SEndre Fülöp 
37f7a46d70SEndre Fülöp   if (!tmpvar)
38f7a46d70SEndre Fülöp     return;
39f7a46d70SEndre Fülöp 
40f7a46d70SEndre Fülöp   if (strcmp(tmpvar, "") == 0) { // body of strcmp is unknown
41f7a46d70SEndre Fülöp     // expected-warning@-1{{use of invalidated pointer 'tmpvar' in a function call}}
42f7a46d70SEndre Fülöp   }
43f7a46d70SEndre Fülöp }
44f7a46d70SEndre Fülöp 
incorrect_usage_double_getenv_invalidation(void)45f7a46d70SEndre Fülöp void incorrect_usage_double_getenv_invalidation(void) {
46f7a46d70SEndre Fülöp   char *tmpvar;
47f7a46d70SEndre Fülöp   char *tempvar;
48f7a46d70SEndre Fülöp 
49f7a46d70SEndre Fülöp   tmpvar = getenv("TMP");
50f7a46d70SEndre Fülöp 
51f7a46d70SEndre Fülöp   if (!tmpvar)
52f7a46d70SEndre Fülöp     return;
53f7a46d70SEndre Fülöp 
54f7a46d70SEndre Fülöp   tempvar = getenv("TEMP"); //getenv should not invalidate env in non-pedantic mode
55811b1736SZurab Tsinadze 
56811b1736SZurab Tsinadze   if (!tempvar)
57811b1736SZurab Tsinadze     return;
58811b1736SZurab Tsinadze 
59811b1736SZurab Tsinadze   if (strcmp(tmpvar, tempvar) == 0) { // body of strcmp is unknown
60f7a46d70SEndre Fülöp     // pedantic-warning@-1{{use of invalidated pointer 'tmpvar' in a function call}}
61811b1736SZurab Tsinadze   }
62811b1736SZurab Tsinadze }
63811b1736SZurab Tsinadze 
correct_usage_1(void)64811b1736SZurab Tsinadze void correct_usage_1(void) {
65811b1736SZurab Tsinadze   char *tmpvar;
66811b1736SZurab Tsinadze   char *tempvar;
67811b1736SZurab Tsinadze 
68811b1736SZurab Tsinadze   const char *temp = getenv("TMP");
69811b1736SZurab Tsinadze   if (temp != NULL) {
70811b1736SZurab Tsinadze     tmpvar = (char *)malloc(strlen(temp)+1);
71811b1736SZurab Tsinadze     if (tmpvar != NULL) {
72811b1736SZurab Tsinadze       strcpy(tmpvar, temp);
73811b1736SZurab Tsinadze     } else {
74811b1736SZurab Tsinadze       return;
75811b1736SZurab Tsinadze     }
76811b1736SZurab Tsinadze   } else {
77811b1736SZurab Tsinadze     return;
78811b1736SZurab Tsinadze   }
79811b1736SZurab Tsinadze 
80811b1736SZurab Tsinadze   temp = getenv("TEMP");
81811b1736SZurab Tsinadze   if (temp != NULL) {
82811b1736SZurab Tsinadze     tempvar = (char *)malloc(strlen(temp)+1);
83811b1736SZurab Tsinadze     if (tempvar != NULL) {
84811b1736SZurab Tsinadze       strcpy(tempvar, temp);
85811b1736SZurab Tsinadze     } else {
86811b1736SZurab Tsinadze       return;
87811b1736SZurab Tsinadze     }
88811b1736SZurab Tsinadze   } else {
89811b1736SZurab Tsinadze     return;
90811b1736SZurab Tsinadze   }
91811b1736SZurab Tsinadze 
92811b1736SZurab Tsinadze   if (strcmp(tmpvar, tempvar) == 0) {
93811b1736SZurab Tsinadze     printf("TMP and TEMP are the same.\n");
94811b1736SZurab Tsinadze   } else {
95811b1736SZurab Tsinadze     printf("TMP and TEMP are NOT the same.\n");
96811b1736SZurab Tsinadze   }
97811b1736SZurab Tsinadze   free(tmpvar);
98811b1736SZurab Tsinadze   free(tempvar);
99811b1736SZurab Tsinadze }
100811b1736SZurab Tsinadze 
correct_usage_2(void)101811b1736SZurab Tsinadze void correct_usage_2(void) {
102811b1736SZurab Tsinadze   char *tmpvar;
103811b1736SZurab Tsinadze   char *tempvar;
104811b1736SZurab Tsinadze 
105811b1736SZurab Tsinadze   const char *temp = getenv("TMP");
106811b1736SZurab Tsinadze   if (temp != NULL) {
107811b1736SZurab Tsinadze     tmpvar = strdup(temp);
108811b1736SZurab Tsinadze     if (tmpvar == NULL) {
109811b1736SZurab Tsinadze       return;
110811b1736SZurab Tsinadze     }
111811b1736SZurab Tsinadze   } else {
112811b1736SZurab Tsinadze     return;
113811b1736SZurab Tsinadze   }
114811b1736SZurab Tsinadze 
115811b1736SZurab Tsinadze   temp = getenv("TEMP");
116811b1736SZurab Tsinadze   if (temp != NULL) {
117811b1736SZurab Tsinadze     tempvar = strdup(temp);
118811b1736SZurab Tsinadze     if (tempvar == NULL) {
119811b1736SZurab Tsinadze       return;
120811b1736SZurab Tsinadze     }
121811b1736SZurab Tsinadze   } else {
122811b1736SZurab Tsinadze     return;
123811b1736SZurab Tsinadze   }
124811b1736SZurab Tsinadze 
125811b1736SZurab Tsinadze   if (strcmp(tmpvar, tempvar) == 0) {
126811b1736SZurab Tsinadze     printf("TMP and TEMP are the same.\n");
127811b1736SZurab Tsinadze   } else {
128811b1736SZurab Tsinadze     printf("TMP and TEMP are NOT the same.\n");
129811b1736SZurab Tsinadze   }
130811b1736SZurab Tsinadze   free(tmpvar);
131811b1736SZurab Tsinadze   tmpvar = NULL;
132811b1736SZurab Tsinadze   free(tempvar);
133811b1736SZurab Tsinadze   tempvar = NULL;
134811b1736SZurab Tsinadze }
135