55#define PATH_MAX 4096
66///// Test code /////
77
8- int main (int argc , char * * argv ) {
8+ int main (int argc , char * * argv ) { // $ Source=argv
99 char * userAndFile = argv [2 ];
1010
1111 {
@@ -14,7 +14,7 @@ int main(int argc, char** argv) {
1414 size_t len = strlen (fileName );
1515 strncat (fileName + len , userAndFile , FILENAME_MAX - len - 1 );
1616 // BAD: a string from the user is used in a filename
17- fopen (fileName , "wb+" );
17+ fopen (fileName , "wb+" ); // $ Alert=argv
1818 }
1919
2020 {
@@ -29,30 +29,30 @@ int main(int argc, char** argv) {
2929
3030 {
3131 char * fileName = argv [1 ];
32- fopen (fileName , "wb+" ); // BAD
32+ fopen (fileName , "wb+" ); // $ Alert=argv
3333 }
3434
3535 {
3636 char fileName [20 ];
37- scanf ("%s" , fileName );
38- fopen (fileName , "wb+" ); // BAD
37+ scanf ("%s" , fileName ); // $ Source=scanf_output1
38+ fopen (fileName , "wb+" ); // $ Alert=scanf_output1
3939 }
4040
4141 {
4242 char * fileName = (char * )malloc (20 * sizeof (char ));
43- scanf ("%s" , fileName );
44- fopen (fileName , "wb+" ); // BAD
43+ scanf ("%s" , fileName ); // $ Source=scanf_output2
44+ fopen (fileName , "wb+" ); // $ Alert=scanf_output2
4545 }
4646
4747 {
48- char * tainted = getenv ("A_STRING" );
49- fopen (tainted , "wb+" ); // BAD
48+ char * tainted = getenv ("A_STRING" ); // $ Source=getenv1
49+ fopen (tainted , "wb+" ); // $ Alert=getenv1
5050 }
5151
5252 {
5353 char buffer [1024 ];
54- strncpy (buffer , getenv ("A_STRING" ), 1024 );
55- fopen (buffer , "wb+" ); // BAD
54+ strncpy (buffer , getenv ("A_STRING" ), 1024 ); // $ Source=getenv2
55+ fopen (buffer , "wb+" ); // $ Alert=getenv2
5656 fopen (buffer , "wb+" ); // (we don't want a duplicate result here)
5757 }
5858
@@ -66,22 +66,22 @@ int main(int argc, char** argv) {
6666
6767 {
6868 void readFile (const char * fileName );
69- readFile (argv [1 ]); // BAD
69+ readFile (argv [1 ]); // $ Alert=argv
7070 }
7171
7272 {
7373 char buffer [1024 ];
74- read (0 , buffer , 1024 );
75- read (0 , buffer , 1024 );
76- fopen (buffer , "wb+" ); // BAD [duplicated with both sources]
74+ read (0 , buffer , 1024 ); // $ Source=read_output1
75+ read (0 , buffer , 1024 ); // $ Source=read_output2
76+ fopen (buffer , "wb+" ); // $ SPURIOUS: Alert=read_output1 $ Alert=read_output2 [duplicated with both sources]
7777 }
7878
7979 {
8080 char * userAndFile = argv [2 ];
8181 char fileBuffer [PATH_MAX ];
8282 snprintf (fileBuffer , sizeof (fileBuffer ), "/home/%s" , userAndFile );
8383 // BAD: a string from the user is used in a filename
84- fopen (fileBuffer , "wb+" );
84+ fopen (fileBuffer , "wb+" ); // $ Alert=argv
8585 }
8686
8787 {
@@ -95,7 +95,7 @@ int main(int argc, char** argv) {
9595 char fileBuffer [PATH_MAX ];
9696 snprintf (fileBuffer , sizeof (fileBuffer ), "/home/user/files/%s" , fileName );
9797 // GOOD: We know that the filename is safe and stays within the public folder. But we currently get an FP here.
98- FILE * file = fopen (fileBuffer , "wb+" );
98+ FILE * file = fopen (fileBuffer , "wb+" ); // $ SPURIOUS: Alert=argv
9999 }
100100
101101 {
0 commit comments