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