diff options
author | Balazs Benics <balazs.benics@sigmatechnology.se> | 2021-10-13 10:50:26 +0200 |
---|---|---|
committer | Balazs Benics <balazs.benics@sigmatechnology.se> | 2021-10-13 10:50:26 +0200 |
commit | 7fc150309d27b0f98239bec758b895efda8c0481 (patch) | |
tree | d2b1ab8c0ee55adf34eac4a2f394c3334d44ec9a /clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | |
parent | fc2ba5e53d47a07f505ddee2441b3768e446624c (diff) | |
download | llvm-7fc150309d27b0f98239bec758b895efda8c0481.zip llvm-7fc150309d27b0f98239bec758b895efda8c0481.tar.gz llvm-7fc150309d27b0f98239bec758b895efda8c0481.tar.bz2 |
[analyzer] Bifurcate on getenv() calls
The `getenv()` function might return `NULL` just like any other function.
However, in case of `getenv()` a state-split seems justified since the
programmer should expect the failure of this function.
`secure_getenv(const char *name)` behaves the same way but is not handled
right now.
Note that `std::getenv()` is also not handled.
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D111245
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp index e758b46..74adc58 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp @@ -1433,6 +1433,14 @@ void StdLibraryFunctionsChecker::initFunctionSummaries( RetType{Ssize_tTy}), GetLineSummary); + // char *getenv(const char *name); + addToFunctionSummaryMap( + "getenv", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}), + Summary(NoEvalCall) + .Case({NotNull(Ret)}) + .Case({NotNull(Ret)->negate()}) + .ArgConstraint(NotNull(ArgNo(0)))); + if (ModelPOSIX) { // long a64l(const char *str64); |