xref: /llvm-project/clang/test/Analysis/errno-stdlibraryfunctions-notes.c (revision 72d3bf2b87ff7fab1a189d76f516bc03eac3271d)
1957014daSBalázs Kéri // RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \
2957014daSBalázs Kéri // RUN:   -analyzer-checker=core \
3957014daSBalázs Kéri // RUN:   -analyzer-checker=debug.ExprInspection \
4c202a17dSBalázs Kéri // RUN:   -analyzer-checker=unix.StdCLibraryFunctions \
5957014daSBalázs Kéri // RUN:   -analyzer-checker=apiModeling.Errno \
6*72d3bf2bSBalázs Kéri // RUN:   -analyzer-checker=unix.Errno \
7c202a17dSBalázs Kéri // RUN:   -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true
8957014daSBalázs Kéri 
9957014daSBalázs Kéri #include "Inputs/errno_var.h"
10957014daSBalázs Kéri 
11957014daSBalázs Kéri int access(const char *path, int amode);
12957014daSBalázs Kéri 
13957014daSBalázs Kéri void clang_analyzer_warnIfReached();
14957014daSBalázs Kéri 
test1()15957014daSBalázs Kéri void test1() {
16957014daSBalázs Kéri   access("path", 0);
1739670ae3SBalázs Kéri   access("path", 0);
18699e1019SBalázs Kéri   // expected-note@-1{{Assuming that 'access' is successful; 'errno' becomes undefined after the call}}
19957014daSBalázs Kéri   if (errno != 0) {
20957014daSBalázs Kéri     // expected-warning@-1{{An undefined value may be read from 'errno'}}
21957014daSBalázs Kéri     // expected-note@-2{{An undefined value may be read from 'errno'}}
22957014daSBalázs Kéri   }
23957014daSBalázs Kéri }
24957014daSBalázs Kéri 
test2()25957014daSBalázs Kéri void test2() {
26957014daSBalázs Kéri   if (access("path", 0) == -1) {
27f12808abSBalázs Kéri     // expected-note@-1{{Taking true branch}}
28957014daSBalázs Kéri     // Failure path.
29957014daSBalázs Kéri     if (errno != 0) {
30957014daSBalázs Kéri       // expected-note@-1{{'errno' is not equal to 0}}
31957014daSBalázs Kéri       // expected-note@-2{{Taking true branch}}
32957014daSBalázs Kéri       clang_analyzer_warnIfReached(); // expected-note {{REACHABLE}} expected-warning {{REACHABLE}}
33957014daSBalázs Kéri     } else {
34957014daSBalázs Kéri       clang_analyzer_warnIfReached(); // no-warning: We are on the failure path.
35957014daSBalázs Kéri     }
36957014daSBalázs Kéri   }
37957014daSBalázs Kéri }
38957014daSBalázs Kéri 
test3()39957014daSBalázs Kéri void test3() {
40957014daSBalázs Kéri   if (access("path", 0) != -1) {
41957014daSBalázs Kéri     // Success path.
42699e1019SBalázs Kéri     // expected-note@-2{{Assuming that 'access' is successful; 'errno' becomes undefined after the call}}
43f12808abSBalázs Kéri     // expected-note@-3{{Taking true branch}}
44957014daSBalázs Kéri     if (errno != 0) {
45957014daSBalázs Kéri       // expected-warning@-1{{An undefined value may be read from 'errno'}}
46957014daSBalázs Kéri       // expected-note@-2{{An undefined value may be read from 'errno'}}
47957014daSBalázs Kéri     }
48957014daSBalázs Kéri   }
49957014daSBalázs Kéri }
50