1811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1 -analyzer-output=text -Wno-unused %s \
2*b98a5949SEndre Fülöp // RUN: -analyzer-checker=core,security.cert.env.InvalidPtr \
3811b1736SZurab Tsinadze // RUN: -verify=putenv,common \
4811b1736SZurab Tsinadze // RUN: -DENV_INVALIDATING_CALL="putenv(\"X=Y\")"
5811b1736SZurab Tsinadze //
6811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1 -analyzer-output=text -Wno-unused %s \
7*b98a5949SEndre Fülöp // RUN: -analyzer-checker=core,security.cert.env.InvalidPtr \
8811b1736SZurab Tsinadze // RUN: -verify=putenvs,common \
9811b1736SZurab Tsinadze // RUN: -DENV_INVALIDATING_CALL="_putenv_s(\"X\", \"Y\")"
10811b1736SZurab Tsinadze //
11811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1 -analyzer-output=text -Wno-unused %s \
12*b98a5949SEndre Fülöp // RUN: -analyzer-checker=core,security.cert.env.InvalidPtr \
13811b1736SZurab Tsinadze // RUN: -verify=wputenvs,common \
14811b1736SZurab Tsinadze // RUN: -DENV_INVALIDATING_CALL="_wputenv_s(\"X\", \"Y\")"
15811b1736SZurab Tsinadze //
16811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1 -analyzer-output=text -Wno-unused %s \
17*b98a5949SEndre Fülöp // RUN: -analyzer-checker=core,security.cert.env.InvalidPtr \
18811b1736SZurab Tsinadze // RUN: -verify=setenv,common \
19811b1736SZurab Tsinadze // RUN: -DENV_INVALIDATING_CALL="setenv(\"X\", \"Y\", 0)"
20811b1736SZurab Tsinadze //
21811b1736SZurab Tsinadze // RUN: %clang_analyze_cc1 -analyzer-output=text -Wno-unused %s \
22*b98a5949SEndre Fülöp // RUN: -analyzer-checker=core,security.cert.env.InvalidPtr \
23811b1736SZurab Tsinadze // RUN: -verify=unsetenv,common \
24811b1736SZurab Tsinadze // RUN: -DENV_INVALIDATING_CALL="unsetenv(\"X\")"
25811b1736SZurab Tsinadze
26811b1736SZurab Tsinadze typedef int errno_t;
27811b1736SZurab Tsinadze typedef char wchar_t;
28811b1736SZurab Tsinadze
29811b1736SZurab Tsinadze int putenv(char *string);
30811b1736SZurab Tsinadze errno_t _putenv_s(const char *varname, const char *value_string);
31811b1736SZurab Tsinadze errno_t _wputenv_s(const wchar_t *varname, const wchar_t *value_string);
32811b1736SZurab Tsinadze int setenv(const char *name, const char *value, int overwrite);
33811b1736SZurab Tsinadze int unsetenv(const char *name);
34811b1736SZurab Tsinadze
35811b1736SZurab Tsinadze void fn_without_body(char **e);
fn_with_body(char ** e)36811b1736SZurab Tsinadze void fn_with_body(char **e) {}
37811b1736SZurab Tsinadze
call_env_invalidating_fn(char ** e)38811b1736SZurab Tsinadze void call_env_invalidating_fn(char **e) {
39811b1736SZurab Tsinadze ENV_INVALIDATING_CALL;
40811b1736SZurab Tsinadze // putenv-note@-1 5 {{'putenv' call may invalidate the environment parameter of 'main'}}
41811b1736SZurab Tsinadze // putenvs-note@-2 5 {{'_putenv_s' call may invalidate the environment parameter of 'main'}}
42811b1736SZurab Tsinadze // wputenvs-note@-3 5 {{'_wputenv_s' call may invalidate the environment parameter of 'main'}}
43811b1736SZurab Tsinadze // setenv-note@-4 5 {{'setenv' call may invalidate the environment parameter of 'main'}}
44811b1736SZurab Tsinadze // unsetenv-note@-5 5 {{'unsetenv' call may invalidate the environment parameter of 'main'}}
45811b1736SZurab Tsinadze
46811b1736SZurab Tsinadze *e;
47811b1736SZurab Tsinadze // common-warning@-1 {{dereferencing an invalid pointer}}
48811b1736SZurab Tsinadze // common-note@-2 {{dereferencing an invalid pointer}}
49811b1736SZurab Tsinadze }
50811b1736SZurab Tsinadze
main(int argc,char * argv[],char * envp[])51811b1736SZurab Tsinadze int main(int argc, char *argv[], char *envp[]) {
52811b1736SZurab Tsinadze char **e = envp;
53811b1736SZurab Tsinadze *e; // no-warning
54811b1736SZurab Tsinadze e[0]; // no-warning
55811b1736SZurab Tsinadze *envp; // no-warning
56811b1736SZurab Tsinadze call_env_invalidating_fn(e);
57811b1736SZurab Tsinadze // common-note@-1 5 {{Calling 'call_env_invalidating_fn'}}
58811b1736SZurab Tsinadze // common-note@-2 4 {{Returning from 'call_env_invalidating_fn'}}
59811b1736SZurab Tsinadze
60811b1736SZurab Tsinadze *e;
61811b1736SZurab Tsinadze // common-warning@-1 {{dereferencing an invalid pointer}}
62811b1736SZurab Tsinadze // common-note@-2 {{dereferencing an invalid pointer}}
63811b1736SZurab Tsinadze
64811b1736SZurab Tsinadze *envp;
65811b1736SZurab Tsinadze // common-warning@-1 2 {{dereferencing an invalid pointer}}
66811b1736SZurab Tsinadze // common-note@-2 2 {{dereferencing an invalid pointer}}
67811b1736SZurab Tsinadze
68811b1736SZurab Tsinadze fn_without_body(e);
69811b1736SZurab Tsinadze // common-warning@-1 {{use of invalidated pointer 'e' in a function call}}
70811b1736SZurab Tsinadze // common-note@-2 {{use of invalidated pointer 'e' in a function call}}
71811b1736SZurab Tsinadze
72811b1736SZurab Tsinadze fn_with_body(e); // no-warning
73811b1736SZurab Tsinadze }
74