aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
diff options
context:
space:
mode:
authorZiqing Luo <ziqing@udel.edu>2025-03-11 10:23:03 -0700
committerGitHub <noreply@github.com>2025-03-11 10:23:03 -0700
commit65016475084f6435dbf252997d53853c2bfdf9be (patch)
treeabad2b1f1ffc57a57cc621e272f0269397fdb0c9 /clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
parentf10a8706a1443dec834929dadcce837082df64b7 (diff)
downloadllvm-65016475084f6435dbf252997d53853c2bfdf9be.zip
llvm-65016475084f6435dbf252997d53853c2bfdf9be.tar.gz
llvm-65016475084f6435dbf252997d53853c2bfdf9be.tar.bz2
[StaticAnalyzer] Relax the pre-condition of 'setsockopt' (#130683)
For the unix function `int setsockopt(int, int, int, const void *, socklen_t);`, the last two parameters represent a buffer and a size. In case the size is zero, buffer can be null. Previously, the hard-coded pre-condition requires the buffer to never be null, which can cause false positives. (rdar://146678142)
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
index 356d63e..fef19b4 100644
--- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp
@@ -1797,7 +1797,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
auto IsNull = [&](ArgNo ArgN) {
return std::make_shared<NotNullConstraint>(ArgN, false);
};
- auto NotNullBuffer = [&](ArgNo ArgN, ArgNo SizeArg1N, ArgNo SizeArg2N) {
+ auto NotNullBuffer = [&](ArgNo ArgN, ArgNo SizeArg1N,
+ std::optional<ArgNo> SizeArg2N = std::nullopt) {
return std::make_shared<NotNullBufferConstraint>(ArgN, SizeArg1N,
SizeArg2N);
};
@@ -3365,7 +3366,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
Summary(NoEvalCall)
.Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
.Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
- .ArgConstraint(NotNull(ArgNo(3)))
+ .ArgConstraint(NotNullBuffer(ArgNo(3), ArgNo(4)))
.ArgConstraint(
BufferSize(/*Buffer=*/ArgNo(3), /*BufSize=*/ArgNo(4)))
.ArgConstraint(