160f3b071SBalázs Kéri // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ 260f3b071SBalázs Kéri // RUN: -analyzer-checker=core \ 360f3b071SBalázs Kéri // RUN: -analyzer-checker=apiModeling.Errno \ 460f3b071SBalázs Kéri // RUN: -analyzer-checker=debug.ExprInspection \ 560f3b071SBalázs Kéri // RUN: -analyzer-checker=debug.ErrnoTest \ 6*72d3bf2bSBalázs Kéri // RUN: -analyzer-checker=unix.Errno \ 760f3b071SBalázs Kéri // RUN: -DERRNO_VAR 860f3b071SBalázs Kéri 960f3b071SBalázs Kéri // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \ 1060f3b071SBalázs Kéri // RUN: -analyzer-checker=core \ 1160f3b071SBalázs Kéri // RUN: -analyzer-checker=apiModeling.Errno \ 1260f3b071SBalázs Kéri // RUN: -analyzer-checker=debug.ExprInspection \ 1360f3b071SBalázs Kéri // RUN: -analyzer-checker=debug.ErrnoTest \ 14*72d3bf2bSBalázs Kéri // RUN: -analyzer-checker=unix.Errno \ 1560f3b071SBalázs Kéri // RUN: -DERRNO_FUNC 1660f3b071SBalázs Kéri 1760f3b071SBalázs Kéri #include "Inputs/errno_var.h" 1860f3b071SBalázs Kéri #include "Inputs/system-header-simulator.h" 1960f3b071SBalázs Kéri #ifdef ERRNO_VAR 2060f3b071SBalázs Kéri #include "Inputs/errno_var.h" 2160f3b071SBalázs Kéri #endif 2260f3b071SBalázs Kéri #ifdef ERRNO_FUNC 2360f3b071SBalázs Kéri #include "Inputs/errno_func.h" 2460f3b071SBalázs Kéri #endif 2560f3b071SBalázs Kéri 2660f3b071SBalázs Kéri int ErrnoTesterChecker_setErrnoCheckState(); 2760f3b071SBalázs Kéri 2860f3b071SBalázs Kéri void something(); 2960f3b071SBalázs Kéri testErrnoCheckUndefRead()3060f3b071SBalázs Kérivoid testErrnoCheckUndefRead() { 3160f3b071SBalázs Kéri int X = ErrnoTesterChecker_setErrnoCheckState(); 3260f3b071SBalázs Kéri something(); 3360f3b071SBalázs Kéri X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function succeeds but sets 'errno' to an unspecified value}} 3460f3b071SBalázs Kéri if (X == 0) { // expected-note{{'X' is equal to 0}} 3560f3b071SBalázs Kéri // expected-note@-1{{Taking true branch}} 3660f3b071SBalázs Kéri if (errno) { 3760f3b071SBalázs Kéri } // expected-warning@-1{{An undefined value may be read from 'errno'}} 3860f3b071SBalázs Kéri // expected-note@-2{{An undefined value may be read from 'errno'}} 3960f3b071SBalázs Kéri } 4060f3b071SBalázs Kéri } 4160f3b071SBalázs Kéri testErrnoCheckOverwrite()4260f3b071SBalázs Kérivoid testErrnoCheckOverwrite() { 4360f3b071SBalázs Kéri int X = ErrnoTesterChecker_setErrnoCheckState(); 4460f3b071SBalázs Kéri something(); 4560f3b071SBalázs Kéri X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} 4660f3b071SBalázs Kéri if (X == 2) { // expected-note{{'X' is equal to 2}} 4760f3b071SBalázs Kéri // expected-note@-1{{Taking true branch}} 4860f3b071SBalázs Kéri errno = 0; // expected-warning{{Value of 'errno' was not checked and is overwritten here}} 4960f3b071SBalázs Kéri // expected-note@-1{{Value of 'errno' was not checked and is overwritten here}} 5060f3b071SBalázs Kéri } 5160f3b071SBalázs Kéri } 5260f3b071SBalázs Kéri testErrnoCheckOverwriteStdCall()5360f3b071SBalázs Kérivoid testErrnoCheckOverwriteStdCall() { 5460f3b071SBalázs Kéri int X = ErrnoTesterChecker_setErrnoCheckState(); 5560f3b071SBalázs Kéri something(); 5660f3b071SBalázs Kéri X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}} 5760f3b071SBalázs Kéri if (X == 2) { // expected-note{{'X' is equal to 2}} 5860f3b071SBalázs Kéri // expected-note@-1{{Taking true branch}} 5960f3b071SBalázs Kéri printf(""); // expected-warning{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} 6060f3b071SBalázs Kéri // expected-note@-1{{Value of 'errno' was not checked and may be overwritten by function 'printf'}} 6160f3b071SBalázs Kéri } 6260f3b071SBalázs Kéri } 63