1 // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ 2 // RUN: -analyzer-checker=core \ 3 // RUN: -analyzer-checker=apiModeling.Errno \ 4 // RUN: -analyzer-checker=debug.ExprInspection \ 5 // RUN: -analyzer-checker=debug.ErrnoTest \ 6 // RUN: -analyzer-checker=unix.Errno \ 7 // RUN: -DERRNO_VAR 8 9 // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ 10 // RUN: -analyzer-checker=core \ 11 // RUN: -analyzer-checker=apiModeling.Errno \ 12 // RUN: -analyzer-checker=debug.ExprInspection \ 13 // RUN: -analyzer-checker=debug.ErrnoTest \ 14 // RUN: -analyzer-checker=unix.Errno \ 15 // RUN: -DERRNO_FUNC 16 17 #include "Inputs/errno_var.h" 18 #include "Inputs/system-header-simulator.h" 19 #ifdef ERRNO_VAR 20 #include "Inputs/errno_var.h" 21 #endif 22 #ifdef ERRNO_FUNC 23 #include "Inputs/errno_func.h" 24 #endif 25 26 int ErrnoTesterChecker_setErrnoCheckState(); 27 28 void something(); 29 testErrnoCheckUndefRead()30void testErrnoCheckUndefRead() { 31 int X = ErrnoTesterChecker_setErrnoCheckState(); 32 something(); 33 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function succeeds but sets 'errno' to an unspecified value}} 34 if (X == 0) { // expected-note{{'X' is equal to 0}} 35 // expected-note@-1{{Taking true branch}} 36 if (errno) { 37 } // expected-warning@-1{{An undefined value may be read from 'errno'}} 38 // expected-note@-2{{An undefined value may be read from 'errno'}} 39 } 40 } 41 testErrnoCheckOverwrite()42void testErrnoCheckOverwrite() { 43 int X = ErrnoTesterChecker_setErrnoCheckState(); 44 something(); 45 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} 46 if (X == 2) { // expected-note{{'X' is equal to 2}} 47 // expected-note@-1{{Taking true branch}} 48 errno = 0; // expected-warning{{Value of 'errno' was not checked and is overwritten here}} 49 // expected-note@-1{{Value of 'errno' was not checked and is overwritten here}} 50 } 51 } 52 testErrnoCheckOverwriteStdCall()53void testErrnoCheckOverwriteStdCall() { 54 int X = ErrnoTesterChecker_setErrnoCheckState(); 55 something(); 56 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} 57 if (X == 2) { // expected-note{{'X' is equal to 2}} 58 // expected-note@-1{{Taking true branch}} 59 printf(""); // expected-warning{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} 60 // expected-note@-1{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} 61 } 62 } 63