summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-05-15 18:41:32 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-05-15 18:41:32 +0000
commit07c7257cdc7f7fda8343d45e645a4c59f66835a1 (patch)
treedaa20aea391f182b6d18c6ad160ad393c1532ed1
parentf672b6170ce8cf1f3dac48a167947c868beaa6e5 (diff)
downloadbcm5719-llvm-07c7257cdc7f7fda8343d45e645a4c59f66835a1.tar.gz
bcm5719-llvm-07c7257cdc7f7fda8343d45e645a4c59f66835a1.zip
[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 llvm-svn: 360790
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp5
-rw-r--r--clang/test/Analysis/osobject-retain-release.cpp13
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
index 1ccf3829537..b7cbcc7d53b 100644
--- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
@@ -537,6 +537,11 @@ updateOutParameters(ProgramStateRef State, const RetainSummary &Summ,
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);
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp
index 35d91add1a9..98b3e95abfd 100644
--- a/clang/test/Analysis/osobject-retain-release.cpp
+++ b/clang/test/Analysis/osobject-retain-release.cpp
@@ -702,3 +702,16 @@ OSObject *testSuppressionForMethodsEndingWithMatching(IOService *svc,
// 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
OpenPOWER on IntegriCloud