diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-05-15 18:41:32 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-05-15 18:41:32 +0000 |
commit | 07c7257cdc7f7fda8343d45e645a4c59f66835a1 (patch) | |
tree | daa20aea391f182b6d18c6ad160ad393c1532ed1 | |
parent | f672b6170ce8cf1f3dac48a167947c868beaa6e5 (diff) | |
download | bcm5719-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.cpp | 5 | ||||
-rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 13 |
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 |