<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Couple of points. Test case is missing. Can we suggest what those APIs are and provide fixit’s if it is not<div>too complicated to do?</div><div><br></div><div>- Fariborz</div><div><br><div><div>On Apr 22, 2013, at 3:46 PM, Ted Kremenek <<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Author: kremenek<br>Date: Mon Apr 22 17:46:52 2013<br>New Revision: 180062<br><br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=180062&view=rev">http://llvm.org/viewvc/llvm-project?rev=180062&view=rev</a><br>Log:<br>Add a warning for Objective-C pointer introspection, which is solely the job of the Objective-C runtime.<br><br>Modified:<br>   cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>   cfe/trunk/lib/Sema/SemaExpr.cpp<br><br>Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=180062&r1=180061&r2=180062&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=180062&r1=180061&r2=180062&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Apr 22 17:46:52 2013<br>@@ -642,6 +642,10 @@ def warn_objc_isa_use : Warning<<br>def warn_objc_isa_assign : Warning<<br>  "assignment to Objective-C's isa is deprecated in favor of "<br>  "object_setClass()">, InGroup<DeprecatedObjCIsaUsage>;<br>+def warn_objc_pointer_masking : Warning<<br>+  "bitmasking for introspection of Objective-C object pointers is strongly "<br>+  "discouraged in favor of using runtime APIs">,<br>+  InGroup<DiagGroup<"deprecated-objc-pointer-introspection">>;<br>def warn_objc_property_default_assign_on_object : Warning<<br>  "default property attribute 'assign' not appropriate for non-GC object">,<br>  InGroup<ObjCPropertyNoAttribute>;<br><br>Modified: cfe/trunk/lib/Sema/SemaExpr.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=180062&r1=180061&r2=180062&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=180062&r1=180061&r2=180062&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br>+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Apr 22 17:46:52 2013<br>@@ -8559,6 +8559,36 @@ static void DiagnoseSelfAssignment(Sema<br>      << LHSExpr->getSourceRange() << RHSExpr->getSourceRange();<br>}<br><br>+/// Check if a bitwise-& is performed on an Objective-C pointer.  This<br>+/// is usually indicative of introspection within the Objective-C pointer.<br>+static void checkObjCPointerIntrospection(Sema &S, ExprResult &L, ExprResult &R,<br>+                                          SourceLocation OpLoc) {<br>+  if (!S.getLangOpts().ObjC1)<br>+    return;<br>+<br>+  const Expr *ObjCPointerExpr = 0, *OtherExpr = 0;<br>+  const Expr *LHS = L.get();<br>+  const Expr *RHS = R.get();<br>+<br>+  if (LHS->IgnoreParenCasts()->getType()->isObjCObjectPointerType()) {<br>+    ObjCPointerExpr = LHS;<br>+    OtherExpr = RHS;<br>+  }<br>+  else if (RHS->IgnoreParenCasts()->getType()->isObjCObjectPointerType()) {<br>+    ObjCPointerExpr = RHS;<br>+    OtherExpr = LHS;<br>+  }<br>+<br>+  // This warning is deliberately made very specific to reduce false<br>+  // positives with logic that uses '&' for hashing.  This logic mainly<br>+  // looks for code trying to introspect into tagged pointers, which<br>+  // code should generally never do.<br>+  if (ObjCPointerExpr && isa<IntegerLiteral>(OtherExpr->IgnoreParenCasts())) {<br>+    S.Diag(OpLoc, diag::warn_objc_pointer_masking)<br>+      << ObjCPointerExpr->getSourceRange();<br>+  }<br>+}<br>+<br>/// CreateBuiltinBinOp - Creates a new built-in binary operation with<br>/// operator @p Opc at location @c TokLoc. This routine only supports<br>/// built-in operations; ActOnBinOp handles overloaded operators.<br>@@ -8636,6 +8666,7 @@ ExprResult Sema::CreateBuiltinBinOp(Sour<br>    ResultTy = CheckCompareOperands(LHS, RHS, OpLoc, Opc, false);<br>    break;<br>  case BO_And:<br>+    checkObjCPointerIntrospection(*this, LHS, RHS, OpLoc);<br>  case BO_Xor:<br>  case BO_Or:<br>    ResultTy = CheckBitwiseOperands(LHS, RHS, OpLoc);<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a></div></blockquote></div><br></div></body></html>