xref: /llvm-project/clang/test/Analysis/errno-notes.c (revision 72d3bf2b87ff7fab1a189d76f516bc03eac3271d)
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éri void 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éri void 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éri void 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