diff options
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 10 | ||||
-rw-r--r-- | clang/test/Analysis/retain-release.m | 20 |
2 files changed, 26 insertions, 4 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index b646127cfae..6bb072710f8 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -1171,8 +1171,9 @@ RetainSummaryManager::getFunctionSummary(const FunctionDecl *FD) { break; } - // For CoreGraphics ('CG') types. - if (cocoa::isRefType(RetTy, "CG", FName)) { + // For CoreGraphics ('CG') and CoreVideo ('CV') types. + if (cocoa::isRefType(RetTy, "CG", FName) || + cocoa::isRefType(RetTy, "CV", FName)) { if (isRetain(FD, FName)) S = getUnarySummary(FT, cfretain); else @@ -3372,12 +3373,13 @@ bool RetainCountChecker::evalCall(const CallExpr *CE, CheckerContext &C) const { // Handle: id NSMakeCollectable(CFTypeRef) canEval = II->isStr("NSMakeCollectable"); } else if (ResultTy->isPointerType()) { - // Handle: (CF|CG)Retain + // Handle: (CF|CG|CV)Retain // CFAutorelease // CFMakeCollectable // It's okay to be a little sloppy here (CGMakeCollectable doesn't exist). if (cocoa::isRefType(ResultTy, "CF", FName) || - cocoa::isRefType(ResultTy, "CG", FName)) { + cocoa::isRefType(ResultTy, "CG", FName) || + cocoa::isRefType(ResultTy, "CV", FName)) { canEval = isRetain(FD, FName) || isAutorelease(FD, FName) || isMakeCollectable(FD, FName); } diff --git a/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index f0d91e34c1b..3acf86c7d9e 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/test/Analysis/retain-release.m @@ -1247,6 +1247,26 @@ CVReturn rdar_7283567_2(CFAllocatorRef allocator, size_t width, size_t height, pixelBufferAttributes, pixelBufferOut) ; } +#pragma clang arc_cf_code_audited begin +typedef struct SomeOpaqueStruct *CMSampleBufferRef; +CVImageBufferRef _Nonnull CMSampleBufferGetImageBuffer(CMSampleBufferRef _Nonnull sbuf); +#pragma clang arc_cf_code_audited end + +CVBufferRef _Nullable CVBufferRetain(CVBufferRef _Nullable buffer); +void CVBufferRelease(CF_CONSUMED CVBufferRef _Nullable buffer); + +void testCVPrefixRetain(CMSampleBufferRef sbuf) { + // Make sure RetainCountChecker treats CVFooRetain() as a CF-style retain. + CVPixelBufferRef pixelBuf = CMSampleBufferGetImageBuffer(sbuf); + CVBufferRetain(pixelBuf); + CVBufferRelease(pixelBuf); // no-warning + + + // Make sure result of CVFooRetain() is the same as its argument. + CVPixelBufferRef pixelBufAlias = CVBufferRetain(pixelBuf); + CVBufferRelease(pixelBufAlias); // no-warning +} + //===----------------------------------------------------------------------===// // <rdar://problem/7358899> False leak associated with // CGBitmapContextCreateWithData |