diff options
author | Ziqing Luo <ziqing@udel.edu> | 2025-03-11 10:23:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-11 10:23:03 -0700 |
commit | 65016475084f6435dbf252997d53853c2bfdf9be (patch) | |
tree | abad2b1f1ffc57a57cc621e272f0269397fdb0c9 /clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | |
parent | f10a8706a1443dec834929dadcce837082df64b7 (diff) | |
download | llvm-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.cpp | 5 |
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( |