Skip to content

Commit 0223230

Browse files
authored
[clang][analyzer] Improve modeling of 'fdopen' in StdLibraryFunctionsChecker (#78680)
1 parent b7a66d0 commit 0223230

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,16 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
21712171
.ArgConstraint(NotNull(ArgNo(0)))
21722172
.ArgConstraint(NotNull(ArgNo(1))));
21732173

2174+
// FILE *fdopen(int fd, const char *mode);
2175+
addToFunctionSummaryMap(
2176+
"fdopen",
2177+
Signature(ArgTypes{IntTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2178+
Summary(NoEvalCall)
2179+
.Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2180+
.Case({IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2181+
.ArgConstraint(ArgumentCondition(0, WithinRange, Range(0, IntMax)))
2182+
.ArgConstraint(NotNull(ArgNo(1))));
2183+
21742184
// FILE *tmpfile(void);
21752185
addToFunctionSummaryMap(
21762186
"tmpfile", Signature(ArgTypes{}, RetType{FilePtrTy}),
@@ -2853,15 +2863,6 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
28532863
"pathconf", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{LongTy}),
28542864
Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
28552865

2856-
// FILE *fdopen(int fd, const char *mode);
2857-
// FIXME: Improve for errno modeling.
2858-
addToFunctionSummaryMap(
2859-
"fdopen",
2860-
Signature(ArgTypes{IntTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2861-
Summary(NoEvalCall)
2862-
.ArgConstraint(ArgumentCondition(0, WithinRange, Range(0, IntMax)))
2863-
.ArgConstraint(NotNull(ArgNo(1))));
2864-
28652866
// void rewinddir(DIR *dir);
28662867
addToFunctionSummaryMap(
28672868
"rewinddir", Signature(ArgTypes{DirPtrTy}, RetType{VoidTy}),

clang/test/Analysis/std-c-library-functions-POSIX.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// RUN: -triple i686-unknown-linux 2>&1 | FileCheck %s
1818

1919
// CHECK: Loaded summary for: FILE *fopen(const char *restrict pathname, const char *restrict mode)
20+
// CHECK: Loaded summary for: FILE *fdopen(int fd, const char *mode)
2021
// CHECK: Loaded summary for: FILE *tmpfile(void)
2122
// CHECK: Loaded summary for: FILE *freopen(const char *restrict pathname, const char *restrict mode, FILE *restrict stream)
2223
// CHECK: Loaded summary for: int fclose(FILE *stream)
@@ -78,7 +79,6 @@
7879
// CHECK: Loaded summary for: int close(int fildes)
7980
// CHECK: Loaded summary for: long fpathconf(int fildes, int name)
8081
// CHECK: Loaded summary for: long pathconf(const char *path, int name)
81-
// CHECK: Loaded summary for: FILE *fdopen(int fd, const char *mode)
8282
// CHECK: Loaded summary for: void rewinddir(DIR *dir)
8383
// CHECK: Loaded summary for: void seekdir(DIR *dirp, long loc)
8484
// CHECK: Loaded summary for: int rand_r(unsigned int *seedp)

clang/test/Analysis/stream-errno.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ void check_fopen(void) {
1818
if (errno) {} // expected-warning{{An undefined value may be read from 'errno' [unix.Errno]}}
1919
}
2020

21+
void check_fdopen(int Fd) {
22+
FILE *F = fdopen(Fd, "r");
23+
if (!F) {
24+
clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
25+
if (errno) {} // no-warning
26+
} else {
27+
if (errno) {} // expected-warning{{An undefined value may be read from 'errno' [unix.Errno]}}
28+
}
29+
}
30+
2131
void check_tmpfile(void) {
2232
FILE *F = tmpfile();
2333
if (!F) {

clang/test/Analysis/stream-note.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ void check_note_freopen(void) {
5656

5757
void check_note_fdopen(int fd) {
5858
FILE *F = fdopen(fd, "r"); // expected-note {{Stream opened here}}
59+
// stdargs-note@-1 {{'fdopen' is successful}}
5960
if (!F)
6061
// expected-note@-1 {{'F' is non-null}}
6162
// expected-note@-2 {{Taking false branch}}

0 commit comments

Comments
 (0)