]> granicus.if.org Git - clang/commitdiff
[analyzer] RetainCount: Fix os_returns_retained_on_zero with weird return types.
authorArtem Dergachev <artem.dergachev@gmail.com>
Wed, 15 May 2019 18:41:32 +0000 (18:41 +0000)
committerArtem Dergachev <artem.dergachev@gmail.com>
Wed, 15 May 2019 18:41:32 +0000 (18:41 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360790 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
test/Analysis/osobject-retain-release.cpp

index 1ccf38295372e1af32ebc61fee741049665ce01a..b7cbcc7d53bb59726c1b2536a5bf946c1767dd62 100644 (file)
@@ -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);
index 35d91add1a982df8714a66d9e4d2f582866623cb..98b3e95abfd7181fe1f6f2be0da8ffa600ada874 100644 (file)
@@ -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