diff options
author | Ben Shi <2283975856@qq.com> | 2023-12-30 14:49:42 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-30 14:49:42 +0800 |
commit | 925ff9e1a218720cd61bd7c9f5f85ded4ecbf9a1 (patch) | |
tree | f2013cd3dae3cbd25ecae255ecf2381810d7f4c6 /clang | |
parent | 69bc3718353e7dbb83e5f1fd2695d5eb6e6827fd (diff) | |
download | llvm-925ff9e1a218720cd61bd7c9f5f85ded4ecbf9a1.zip llvm-925ff9e1a218720cd61bd7c9f5f85ded4ecbf9a1.tar.gz llvm-925ff9e1a218720cd61bd7c9f5f85ded4ecbf9a1.tar.bz2 |
[clang][analyzer] Support 'fflush' in the StdLibraryFunctionsChecker (#76557)
Co-authored-by: Balazs Benics <benicsbalazs@gmail.com>
Diffstat (limited to 'clang')
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 4 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | 8 | ||||
-rw-r--r-- | clang/test/Analysis/stream-errno.c | 26 |
3 files changed, 37 insertions, 1 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3c08d18..2d53917 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -1126,9 +1126,11 @@ Improvements ^^^^^^^^^^^^ - Improved the ``unix.StdCLibraryFunctions`` checker by modeling more - functions like ``send``, ``recv``, ``readlink`` and ``errno`` behavior. + functions like ``send``, ``recv``, ``readlink``, ``fflush`` and + ``errno`` behavior. (`52ac71f92d38 <https://github.com/llvm/llvm-project/commit/52ac71f92d38f75df5cb88e9c090ac5fd5a71548>`_, `#71373 <https://github.com/llvm/llvm-project/pull/71373>`_, + `#76557 <https://github.com/llvm/llvm-project/pull/76557>`_, `#71392 <https://github.com/llvm/llvm-project/pull/71392>`_) - Fixed a false negative for when accessing a nonnull property (ObjC). diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp index fffcaf7..4ca49b9 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp @@ -2244,6 +2244,14 @@ void StdLibraryFunctionsChecker::initFunctionSummaries( .ArgConstraint(NotNull(ArgNo(0))) .ArgConstraint(NotNull(ArgNo(1)))); + // int fflush(FILE *stream); + addToFunctionSummaryMap( + "fflush", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}), + Summary(NoEvalCall) + .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg) + .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))}, + ErrnoNEZeroIrrelevant, GenericFailureMsg)); + // long ftell(FILE *stream); // From 'The Open Group Base Specifications Issue 7, 2018 edition': // "The ftell() function shall not change the setting of errno if diff --git a/clang/test/Analysis/stream-errno.c b/clang/test/Analysis/stream-errno.c index bf0a61d..f44ee60 100644 --- a/clang/test/Analysis/stream-errno.c +++ b/clang/test/Analysis/stream-errno.c @@ -222,3 +222,29 @@ void check_fileno(void) { } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } + +void check_fflush_opened_file(void) { + FILE *F = tmpfile(); + if (!F) + return; + int N = fflush(F); + if (N == EOF) { + clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} + if (errno) {} // no-warning + } else { + clang_analyzer_eval(N == 0); // expected-warning{{TRUE}} + if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} + } + fclose(F); +} + +void check_fflush_all(void) { + int N = fflush(NULL); + if (N == 0) { + if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} + } else { + clang_analyzer_eval(N == EOF); // expected-warning{{TRUE}} + clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} + if (errno) {} // no-warning + } +} |