Skip to content

Commit b7f986d

Browse files
authored
[clang][analyzer] Improve modeling of 'execv' and 'execvp' in StdLibraryFunctionsChecker (#78930)
These functions always return -1 and set 'errno'.
1 parent 7950907 commit b7f986d

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3002,15 +3002,15 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
30023002
"execv",
30033003
Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
30043004
Summary(NoEvalCall)
3005-
.Case(ReturnsMinusOne, ErrnoIrrelevant)
3005+
.Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
30063006
.ArgConstraint(NotNull(ArgNo(0))));
30073007

30083008
// int execvp(const char *file, char *const argv[]);
30093009
addToFunctionSummaryMap(
30103010
"execvp",
30113011
Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
30123012
Summary(NoEvalCall)
3013-
.Case(ReturnsMinusOne, ErrnoIrrelevant)
3013+
.Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
30143014
.ArgConstraint(NotNull(ArgNo(0))));
30153015

30163016
// int getopt(int argc, char * const argv[], const char *optstring);

clang/test/Analysis/errno-stdlibraryfunctions.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,17 @@ void errno_getcwd(char *Buf, size_t Sz) {
8989
if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}}
9090
}
9191
}
92+
93+
void errno_execv(char *Path, char * Argv[]) {
94+
int Ret = execv(Path, Argv);
95+
clang_analyzer_eval(Ret == -1); // expected-warning{{TRUE}}
96+
clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
97+
if (errno) {} // no warning
98+
}
99+
100+
void errno_execvp(char *File, char * Argv[]) {
101+
int Ret = execvp(File, Argv);
102+
clang_analyzer_eval(Ret == -1); // expected-warning{{TRUE}}
103+
clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
104+
if (errno) {} // no warning
105+
}

0 commit comments

Comments
 (0)