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érivoid 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érivoid 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érivoid 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