llvm-project/clang/test/Analysis/errno-options.c
Balázs Kéri 60f3b07118 [clang][analyzer] Add checker for bad use of 'errno'.
Extend checker 'ErrnoModeling' with a state of 'errno' to indicate
the importance of the 'errno' value and how it should be used.
Add a new checker 'ErrnoChecker' that observes use of 'errno' and
finds possible wrong uses, based on the "errno state".
The "errno state" should be set (together with value of 'errno')
by other checkers (that perform modeling of the given function)
in the future. Currently only a test function can set this value.
The new checker has no user-observable effect yet.

Reviewed By: martong, steakhal

Differential Revision: https://reviews.llvm.org/D122150
2022-06-20 10:07:31 +02:00

56 lines
1.7 KiB
C

// RUN: %clang_analyze_cc1 -verify %s \
// RUN: -analyzer-checker=core \
// RUN: -analyzer-checker=apiModeling.Errno \
// RUN: -analyzer-checker=debug.ErrnoTest \
// RUN: -analyzer-checker=alpha.unix.Errno \
// RUN: -analyzer-config alpha.unix.Errno:AllowErrnoReadOutsideConditionExpressions=false \
// RUN: -DERRNO_VAR
// RUN: %clang_analyze_cc1 -verify %s \
// RUN: -analyzer-checker=core \
// RUN: -analyzer-checker=apiModeling.Errno \
// RUN: -analyzer-checker=debug.ErrnoTest \
// RUN: -analyzer-checker=alpha.unix.Errno \
// RUN: -analyzer-config alpha.unix.Errno:AllowErrnoReadOutsideConditionExpressions=false \
// RUN: -DERRNO_FUNC
#include "Inputs/system-header-simulator.h"
#ifdef ERRNO_VAR
#include "Inputs/errno_var.h"
#endif
#ifdef ERRNO_FUNC
#include "Inputs/errno_func.h"
#endif
int ErrnoTesterChecker_setErrnoIfError();
void test_cond() {
ErrnoTesterChecker_setErrnoIfError();
int A = errno ? 1 : 2;
// expected-warning@-1{{An undefined value may be read from 'errno'}}
}
void test_errno_store_into_variable() {
ErrnoTesterChecker_setErrnoIfError();
int a = errno;
// expected-warning@-1{{An undefined value may be read from 'errno'}}
}
void test_errno_store_into_variable_in_expr() {
ErrnoTesterChecker_setErrnoIfError();
int a = 4 + errno;
// expected-warning@-1{{An undefined value may be read from 'errno'}}
}
int test_errno_return() {
ErrnoTesterChecker_setErrnoIfError();
return errno;
// expected-warning@-1{{An undefined value may be read from 'errno'}}
}
int test_errno_return_expr() {
ErrnoTesterChecker_setErrnoIfError();
return errno > 10;
// expected-warning@-1{{An undefined value may be read from 'errno'}}
}