xref: /llvm-project/clang/test/Analysis/cert/env31-c.c (revision b98a594977f25e555822e5ceef457f69c73cce45)
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