// RUN: %clang_analyze_cc1 -analyzer-checker=core,security.SetgidSetuidOrder -analyzer-output=text -verify %s typedef int uid_t; typedef int gid_t; int setuid(uid_t); int setgid(gid_t); uid_t getuid(); gid_t getgid(); void test_note_1() { if (setuid(getuid()) == -1) // expected-note{{Assuming the condition is false}} \ // expected-note{{Taking false branch}} return; if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \ // expected-note{{Assuming the condition is false}} \ // expected-note{{Taking false branch}} return; if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} return; } void test_note_2() { if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \ // expected-note 2 {{Assuming the condition is false}} \ // expected-note 2 {{Taking false branch}} return; if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{Assuming the condition is false}} \ // expected-note{{Taking false branch}} return; if (setuid(getuid()) == -1) // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \ // expected-note{{Assuming the condition is false}} \ // expected-note{{Taking false branch}} return; if (setgid(getgid()) == -1) // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} return; } int f_setuid() { return setuid(getuid()); // expected-note{{Call to 'setuid' found here that removes superuser privileges}} } int f_setgid() { return setgid(getgid()); // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} } void test_note_3() { if (f_setuid() == -1) // expected-note{{Assuming the condition is false}} \ // expected-note{{Calling 'f_setuid'}} \ // expected-note{{Returning from 'f_setuid'}} \ // expected-note{{Taking false branch}} return; if (f_setgid() == -1) // expected-note{{Calling 'f_setgid'}} return; } void test_note_4() { if (setuid(getuid()) == 0) { // expected-note{{Assuming the condition is true}} \ // expected-note{{Call to 'setuid' found here that removes superuser privileges}} \ // expected-note{{Taking true branch}} if (setgid(getgid()) == 0) { // expected-warning{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} \ // expected-note{{A 'setgid(getgid())' call following a 'setuid(getuid())' call is likely to fail}} } } }