// 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'}} } }