r220727 - Objective-C ARC [qoi]. Issue diagnostic if __bridge casting

Jordan Rose jordan_rose at apple.com
Mon Oct 27 16:22:57 PDT 2014


> On Oct 27, 2014, at 15:33, Fariborz Jahanian <fjahanian at apple.com> wrote:
> 
> Author: fjahanian
> Date: Mon Oct 27 17:33:06 2014
> New Revision: 220727
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=220727&view=rev
> Log:
> Objective-C ARC [qoi]. Issue diagnostic if __bridge casting
> to C type a collection literal. rdar://18768214
> 
> Added:
>    cfe/trunk/test/SemaObjC/arc-cfbridge-warning.m
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/lib/Sema/SemaExprObjC.cpp
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=220727&r1=220726&r2=220727&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Mon Oct 27 17:33:06 2014
> @@ -422,6 +422,7 @@ def : DiagGroup<"arc-abi">;
> def ARCUnsafeRetainedAssign : DiagGroup<"arc-unsafe-retained-assign">;
> def ARCRetainCycles : DiagGroup<"arc-retain-cycles">;
> def ARCNonPodMemAccess : DiagGroup<"arc-non-pod-memaccess">;
> +def ARCBridgeCastRelease : DiagGroup<"arc-bridge-cast-release">;
> def AutomaticReferenceCounting : DiagGroup<"arc",
>                                            [ARCUnsafeRetainedAssign,
>                                             ARCRetainCycles,
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=220727&r1=220726&r2=220727&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Oct 27 17:33:06 2014
> @@ -4459,6 +4459,11 @@ def note_arc_retain_cycle_owner : Note<
> def warn_arc_object_memaccess : Warning<
>   "%select{destination for|source of}0 this %1 call is a pointer to "
>   "ownership-qualified type %2">, InGroup<ARCNonPodMemAccess>;
> +  
> +def warn_arc_consumed_object_released : Warning<
> +  "__bridge cast of collection literal of type %1 to \"bridgeable\" C "
> +  "type %0 causes early release of the collection">,
> +  InGroup<ARCBridgeCastRelease>;

Just my opinion, but I would drop the quotes from "bridgeable", and drop "C" entirely. Then you get "__bridge cast of collection literal of type 'NSArray *' to bridgeable type 'CFArrayRef' ...".

What does maybeUndoReclaimObject do? Does that mean we previously treated this as a bridge at +1?

Jordan


> let CategoryName = "ARC and @properties" in {
> 
> 
> Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=220727&r1=220726&r2=220727&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Mon Oct 27 17:33:06 2014
> @@ -4075,11 +4075,22 @@ ExprResult Sema::BuildObjCBridgedCast(So
>     // Okay: id -> CF
>     CK = CK_BitCast;
>     switch (Kind) {
> -    case OBC_Bridge:
> -      // Reclaiming a value that's going to be __bridge-casted to CF
> -      // is very dangerous, so we don't do it.
> -      SubExpr = maybeUndoReclaimObject(SubExpr);
> -      break;
> +      case OBC_Bridge: {
> +        const ImplicitCastExpr *implCE = dyn_cast<ImplicitCastExpr>(SubExpr);
> +        while (implCE && implCE->getCastKind() ==  CK_BitCast)
> +          implCE = dyn_cast<ImplicitCastExpr>(implCE->getSubExpr());
> +        if (implCE && (implCE->getCastKind() == CK_ARCConsumeObject))
> +          if (const Expr *LitExp = implCE->getSubExpr())
> +            if ((isa<ObjCArrayLiteral>(LitExp) ||
> +                 isa<ObjCDictionaryLiteral>(LitExp)) &&
> +                T->isCARCBridgableType())
> +              Diag(BridgeKeywordLoc, diag::warn_arc_consumed_object_released)
> +                << T << implCE->getType();
> +        // Reclaiming a value that's going to be __bridge-casted to CF
> +        // is very dangerous, so we don't do it.
> +        SubExpr = maybeUndoReclaimObject(SubExpr);
> +        break;
> +      }
> 
>     case OBC_BridgeRetained:        
>       // Produce the object before casting it.
> 
> Added: cfe/trunk/test/SemaObjC/arc-cfbridge-warning.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc-cfbridge-warning.m?rev=220727&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/arc-cfbridge-warning.m (added)
> +++ cfe/trunk/test/SemaObjC/arc-cfbridge-warning.m Mon Oct 27 17:33:06 2014
> @@ -0,0 +1,41 @@
> +// RUN: %clang_cc1 -fsyntax-only -x objective-c -fobjc-arc -verify -Wno-objc-root-class %s
> +// rdar://18768214
> +
> +
> + at class NSArray;
> +typedef const struct __attribute__((objc_bridge(NSArray))) __CFArray * CFArrayRef;
> + at class NSString;
> +typedef const void * CFTypeRef;
> +
> +typedef const struct __attribute__((objc_bridge(NSString))) __CFString * CFStringRef;
> +
> +typedef long NSInteger;
> +typedef unsigned long NSUInteger;
> +
> + at interface NSObject {
> +    Class isa __attribute__((deprecated));
> +}
> ++ (void)initialize;
> +- (instancetype)init;
> ++ (instancetype)new;
> ++ (instancetype)alloc;
> +- (void)dealloc;
> + at end
> +
> + at interface NSArray : NSObject
> + at property (readonly) NSUInteger count;
> +- (id)objectAtIndex:(NSUInteger)index;
> +- (instancetype)init __attribute__((objc_designated_initializer));
> +- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt __attribute__((objc_designated_initializer));
> ++ (instancetype)array;
> ++ (instancetype)arrayWithObject:(id)anObject;
> ++ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
> ++ (instancetype)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1)));
> + at end
> +
> +static CFStringRef _s;
> +
> +CFArrayRef _array()
> +{
> +    return (__bridge CFArrayRef)@[(__bridge NSString *)_s]; // expected-warning {{__bridge cast of collection literal of type 'NSArray *' to "bridgeable" C type 'CFArrayRef' (aka 'const struct __CFArray *') causes early release of the collection}}
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list