http://llvm.org/bugs/show_bug.cgi?id=10794

           Summary: REGRESSION: ObjC objects passed to C++ 'new' are still
                    retain-count-tracked
           Product: clang
           Version: trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: regression
          Severity: normal
          Priority: P
         Component: Static Analyzer
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


Currently, RetainReleaseChecker is supposed to stop tracking the retain counts
of objects that are passed to C++ methods, or generally into C++-land, at least
until we've established what the right behavior should be. This works for
regular methods and for stack constructors, but not for heap constructors, i.e.
C++ objects allocated with 'new'.

Previously this worked almost coincidentally; /every/ argument's retain count
was invalidated /except/ those explicitly whitelisted by the CFRefCount
transfer functions. And CFRefCount never handled C++-only expressions anyway.

One fix is as follows:
1. Add CXXNewExpr to CallOrObjCMessage.
2. Add a post-statement hook for CXXNewExpr.
3. Implement check::PostStmt<CXXNewExpr> on RetainReleaseChecker with the exact
same code as for CXXConstructExprs.

This change occurred (deliberately) in r138716.

Test case (for retain-release.mm):

void test_smartpointer_4() {
  id x = [[NSObject alloc] init];  // no-warning
  SmartPointer *foo = new SmartPointer(x);
  delete foo;
}

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to