llvm-project/clang/test/Analysis/errno-stdlibraryfunctions-notes.c
Balázs Kéri 957014da2d [clang][Analyzer] Add errno state to standard functions modeling.
This updates StdLibraryFunctionsChecker to set the state of 'errno'
by using the new errno_modeling functionality.
The errno value is set in the PostCall callback. Setting it in call::Eval
did not work for some reason and then every function should be
EvalCallAsPure which may be bad to do. Now the errno value and state
is not allowed to be checked in any PostCall checker callback because
it is unspecified if the errno was set already or will be set later
by this checker.

Reviewed By: martong, steakhal

Differential Revision: https://reviews.llvm.org/D125400
2022-06-21 08:56:41 +02:00

50 lines
1.8 KiB
C

// RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \
// RUN: -analyzer-checker=core \
// RUN: -analyzer-checker=debug.ExprInspection \
// RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \
// RUN: -analyzer-checker=apiModeling.Errno \
// RUN: -analyzer-checker=alpha.unix.Errno \
// RUN: -analyzer-config apiModeling.StdCLibraryFunctions:ModelPOSIX=true
#include "Inputs/errno_var.h"
int access(const char *path, int amode);
void clang_analyzer_warnIfReached();
void test1() {
access("path", 0); // no note here
access("path", 0);
// expected-note@-1{{Assuming that function 'access' is successful, in this case the value 'errno' may be undefined after the call and should not be used}}
if (errno != 0) {
// expected-warning@-1{{An undefined value may be read from 'errno'}}
// expected-note@-2{{An undefined value may be read from 'errno'}}
}
}
void test2() {
if (access("path", 0) == -1) {
// expected-note@-1{{Taking true branch}}
// Failure path.
if (errno != 0) {
// expected-note@-1{{'errno' is not equal to 0}}
// expected-note@-2{{Taking true branch}}
clang_analyzer_warnIfReached(); // expected-note {{REACHABLE}} expected-warning {{REACHABLE}}
} else {
clang_analyzer_warnIfReached(); // no-warning: We are on the failure path.
}
}
}
void test3() {
if (access("path", 0) != -1) {
// Success path.
// expected-note@-2{{Assuming that function 'access' is successful, in this case the value 'errno' may be undefined after the call and should not be used}}
// expected-note@-3{{Taking true branch}}
if (errno != 0) {
// expected-warning@-1{{An undefined value may be read from 'errno'}}
// expected-note@-2{{An undefined value may be read from 'errno'}}
}
}
}