r360790 - [analyzer] RetainCount: Fix os_returns_retained_on_zero with weird return types.
Artem Dergachev via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 11:41:32 PDT 2019
Author: dergachev
Date: Wed May 15 11:41:32 2019
New Revision: 360790
URL: http://llvm.org/viewvc/llvm-project?rev=360790&view=rev
Log:
[analyzer] RetainCount: Fix os_returns_retained_on_zero with weird return types.
The checker was crashing when it was trying to assume a structure
to be null or non-null so that to evaluate the effect of the annotation.
Differential Revision: https://reviews.llvm.org/D61958
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
cfe/trunk/test/Analysis/osobject-retain-release.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp?rev=360790&r1=360789&r2=360790&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp Wed May 15 11:41:32 2019
@@ -537,6 +537,11 @@ updateOutParameters(ProgramStateRef Stat
ProgramStateRef AssumeZeroReturn = State;
if (SplitNecessary) {
+ if (!CE.getResultType()->isScalarType()) {
+ // Structures cannot be assumed. This probably deserves
+ // a compiler warning for invalid annotations.
+ return {State};
+ }
if (auto DL = L.getAs<DefinedOrUnknownSVal>()) {
AssumeNonZeroReturn = AssumeNonZeroReturn->assume(*DL, true);
AssumeZeroReturn = AssumeZeroReturn->assume(*DL, false);
Modified: cfe/trunk/test/Analysis/osobject-retain-release.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/osobject-retain-release.cpp?rev=360790&r1=360789&r2=360790&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/osobject-retain-release.cpp (original)
+++ cfe/trunk/test/Analysis/osobject-retain-release.cpp Wed May 15 11:41:32 2019
@@ -702,3 +702,16 @@ OSObject *testSuppressionForMethodsEndin
// returning from it at +0.
return table; // no-warning
}
+
+namespace weird_result {
+struct WeirdResult {
+ int x, y, z;
+};
+
+WeirdResult outParamWithWeirdResult(OS_RETURNS_RETAINED_ON_ZERO OSObject **obj);
+
+WeirdResult testOutParamWithWeirdResult() {
+ OSObject *obj;
+ return outParamWithWeirdResult(&obj); // no-warning
+}
+} // namespace weird_result
More information about the cfe-commits
mailing list