74 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,security.SetgidSetuidOrder -analyzer-output=text -verify %s2 3typedef int uid_t;4typedef int gid_t;5 6int setuid(uid_t);7int setgid(gid_t);8 9uid_t getuid();10gid_t getgid();11 12 13 14void test_note_1() {15 if (setuid(getuid()) == -1) // expected-note{{Assuming the condition is false}} \16 // expected-note{{Taking false branch}}17 return;18 if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \19 // expected-note{{Assuming the condition is false}} \20 // expected-note{{Taking false branch}}21 return;22 if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \23 // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}}24 return;25}26 27void test_note_2() {28 if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \29 // expected-note 2 {{Assuming the condition is false}} \30 // expected-note 2 {{Taking false branch}}31 return;32 if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \33 // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \34 // expected-note{{Assuming the condition is false}} \35 // expected-note{{Taking false branch}}36 return;37 if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \38 // expected-note{{Assuming the condition is false}} \39 // expected-note{{Taking false branch}}40 return;41 if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \42 // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}}43 return;44}45 46int f_setuid() {47 return setuid(getuid()); // expected-note{{Call to 'setuid' found here that removes superuser privileges}}48}49 50int f_setgid() {51 return setgid(getgid()); // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \52 // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}}53}54 55void test_note_3() {56 if (f_setuid() == -1) // expected-note{{Assuming the condition is false}} \57 // expected-note{{Calling 'f_setuid'}} \58 // expected-note{{Returning from 'f_setuid'}} \59 // expected-note{{Taking false branch}}60 return;61 if (f_setgid() == -1) // expected-note{{Calling 'f_setgid'}}62 return;63}64 65void test_note_4() {66 if (setuid(getuid()) == 0) { // expected-note{{Assuming the condition is true}} \67 // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \68 // expected-note{{Taking true branch}}69 if (setgid(getgid()) == 0) { // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \70 // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}}71 }72 }73}74