This revision was automatically updated to reflect the committed changes. Closed by commit rC360790: [analyzer] RetainCount: Fix os_returns_retained_on_zero with weird return types. (authored by dergachev, committed by ).
Changed prior to commit: https://reviews.llvm.org/D61958?vs=199647&id=199650#toc Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D61958/new/ https://reviews.llvm.org/D61958 Files: lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp test/Analysis/osobject-retain-release.cpp Index: test/Analysis/osobject-retain-release.cpp =================================================================== --- test/Analysis/osobject-retain-release.cpp +++ test/Analysis/osobject-retain-release.cpp @@ -702,3 +702,16 @@ // 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 Index: lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp +++ lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp @@ -537,6 +537,11 @@ 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: test/Analysis/osobject-retain-release.cpp =================================================================== --- test/Analysis/osobject-retain-release.cpp +++ test/Analysis/osobject-retain-release.cpp @@ -702,3 +702,16 @@ // 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 Index: lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp +++ lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp @@ -537,6 +537,11 @@ 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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits