| // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ |
| // RUN: -analyzer-checker=core \ |
| // RUN: -analyzer-checker=apiModeling.Errno \ |
| // RUN: -analyzer-checker=debug.ExprInspection \ |
| // RUN: -analyzer-checker=debug.ErrnoTest \ |
| // RUN: -analyzer-checker=unix.Errno \ |
| // RUN: -DERRNO_VAR |
| |
| // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ |
| // RUN: -analyzer-checker=core \ |
| // RUN: -analyzer-checker=apiModeling.Errno \ |
| // RUN: -analyzer-checker=debug.ExprInspection \ |
| // RUN: -analyzer-checker=debug.ErrnoTest \ |
| // RUN: -analyzer-checker=unix.Errno \ |
| // RUN: -DERRNO_FUNC |
| |
| #include "Inputs/errno_var.h" |
| #include "Inputs/system-header-simulator.h" |
| #ifdef ERRNO_VAR |
| #include "Inputs/errno_var.h" |
| #endif |
| #ifdef ERRNO_FUNC |
| #include "Inputs/errno_func.h" |
| #endif |
| |
| int ErrnoTesterChecker_setErrnoCheckState(); |
| |
| void something(); |
| |
| void testErrnoCheckUndefRead() { |
| int X = ErrnoTesterChecker_setErrnoCheckState(); |
| something(); |
| X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function succeeds but sets 'errno' to an unspecified value}} |
| if (X == 0) { // expected-note{{'X' is equal to 0}} |
| // expected-note@-1{{Taking true branch}} |
| if (errno) { |
| } // expected-warning@-1{{An undefined value may be read from 'errno'}} |
| // expected-note@-2{{An undefined value may be read from 'errno'}} |
| } |
| } |
| |
| void testErrnoCheckOverwrite() { |
| int X = ErrnoTesterChecker_setErrnoCheckState(); |
| something(); |
| X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} |
| if (X == 2) { // expected-note{{'X' is equal to 2}} |
| // expected-note@-1{{Taking true branch}} |
| errno = 0; // expected-warning{{Value of 'errno' was not checked and is overwritten here}} |
| // expected-note@-1{{Value of 'errno' was not checked and is overwritten here}} |
| } |
| } |
| |
| void testErrnoCheckOverwriteStdCall() { |
| int X = ErrnoTesterChecker_setErrnoCheckState(); |
| something(); |
| X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} |
| if (X == 2) { // expected-note{{'X' is equal to 2}} |
| // expected-note@-1{{Taking true branch}} |
| printf(""); // expected-warning{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} |
| // expected-note@-1{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} |
| } |
| } |