Hi,<br><br>This has broken our -Werror internal build.<div>One specific thing that I consider a [noisy] false positive:</div><div><br></div><div>#define MY_ASSERT(cond) ((cond)? (void)0 : blah)</div><div>#define BUG(description) MY_ASSERT(!description)</div><div>...</div><div>if (some_condition)</div><div>  BUG("oh this is broken")<br><div><br><div class="gmail_quote">On Fri Nov 14 2014 at 8:16:22 PM Fariborz Jahanian <<a href="mailto:fjahanian@apple.com">fjahanian@apple.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fjahanian<br>
Date: Fri Nov 14 11:12:50 2014<br>
New Revision: 222009<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=222009&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project?rev=222009&view=rev</a><br>
Log:<br>
[Sema]. Warn when logical expression is a pointer<br>
which evaluates to true. rdar://18716393.<br>
Reviewed by Richard Trieu<br>
<br>
Added:<br>
    cfe/trunk/test/Sema/warn-<u></u>tautological-compare.c<br>
Modified:<br>
    cfe/trunk/include/clang/Sema/<u></u>Sema.h<br>
    cfe/trunk/lib/Sema/<u></u>SemaChecking.cpp<br>
    cfe/trunk/lib/Sema/SemaExpr.<u></u>cpp<br>
    cfe/trunk/test/Analysis/<u></u>NSContainers.m<br>
    cfe/trunk/test/Analysis/<u></u>logical-ops.c<br>
    cfe/trunk/test/Analysis/objc-<u></u>boxing.m<br>
    cfe/trunk/test/Sema/exprs.c<br>
<br>
Modified: cfe/trunk/include/clang/Sema/<u></u>Sema.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/include/<u></u>clang/Sema/Sema.h?rev=222009&<u></u>r1=222008&r2=222009&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/include/clang/Sema/<u></u>Sema.h (original)<br>
+++ cfe/trunk/include/clang/Sema/<u></u>Sema.h Fri Nov 14 11:12:50 2014<br>
@@ -2771,6 +2771,8 @@ public:<br>
                                       const AttributeList *AttrList);<br>
<br>
   void checkUnusedDeclAttributes(<u></u>Declarator &D);<br>
+<br>
+  void CheckBoolLikeConversion(Expr *E, SourceLocation CC);<br>
<br>
   /// Determine if type T is a valid subject for a nonnull and similar<br>
   /// attributes. By default, we look through references (the behavior used by<br>
<br>
Modified: cfe/trunk/lib/Sema/<u></u>SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Sema/<u></u>SemaChecking.cpp?rev=222009&<u></u>r1=222008&r2=222009&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/lib/Sema/<u></u>SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<u></u>SemaChecking.cpp Fri Nov 14 11:12:50 2014<br>
@@ -6559,6 +6559,13 @@ void AnalyzeImplicitConversions(<u></u>Sema &S,<br>
       continue;<br>
     AnalyzeImplicitConversions(S, ChildExpr, CC);<br>
   }<br>
+  if (BO && BO->isLogicalOp()) {<br>
+    S.CheckBoolLikeConversion(BO-><u></u>getLHS(), BO->getLHS()->getExprLoc());<br>
+    S.CheckBoolLikeConversion(BO-><u></u>getRHS(), BO->getRHS()->getExprLoc());<br>
+  }<br>
+  if (const UnaryOperator *U = dyn_cast<UnaryOperator>(E))<br>
+    if (U->getOpcode() == UO_LNot)<br>
+      S.CheckBoolLikeConversion(U-><u></u>getSubExpr(), CC);<br>
 }<br>
<br>
 } // end anonymous namespace<br>
@@ -6617,6 +6624,18 @@ static bool IsInAnyMacroBody(const Sourc<br>
   return false;<br>
 }<br>
<br>
+/// CheckBoolLikeConversion - Check conversion of given expression to boolean.<br>
+/// Input argument E is a logical expression.<br>
+static void CheckBoolLikeConversion(Sema &S, Expr *E, SourceLocation CC) {<br>
+  if (S.getLangOpts().Bool)<br>
+    return;<br>
+  CheckImplicitConversion(S, E->IgnoreParenImpCasts(), S.Context.BoolTy, CC);<br>
+}<br>
+<br>
+void Sema::CheckBoolLikeConversion(<u></u>Expr *E, SourceLocation CC) {<br>
+  ::CheckBoolLikeConversion(*<u></u>this, E, CC);<br>
+}<br>
+<br>
 /// \brief Diagnose pointers that are always non-null.<br>
 /// \param E the expression containing the pointer<br>
 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Sema/<u></u>SemaExpr.cpp?rev=222009&r1=<u></u>222008&r2=222009&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/lib/Sema/SemaExpr.<u></u>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.<u></u>cpp Fri Nov 14 11:12:50 2014<br>
@@ -12984,6 +12984,7 @@ ExprResult Sema::CheckBooleanCondition(E<br>
         << T << E->getSourceRange();<br>
       return ExprError();<br>
     }<br>
+    CheckBoolLikeConversion(E, Loc);<br>
   }<br>
<br>
   return E;<br>
<br>
Modified: cfe/trunk/test/Analysis/<u></u>NSContainers.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/NSContainers.m?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/<u></u>Analysis/NSContainers.m?rev=<u></u>222009&r1=222008&r2=222009&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/test/Analysis/<u></u>NSContainers.m (original)<br>
+++ cfe/trunk/test/Analysis/<u></u>NSContainers.m Fri Nov 14 11:12:50 2014<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.<u></u>cocoa.NonNilReturnValue,osx.<u></u>cocoa.NilArg,osx.cocoa.Loops,<u></u>debug.ExprInspection -verify -Wno-objc-root-class %s<br>
+// RUN: %clang_cc1  -Wno-objc-literal-conversion -analyze -analyzer-checker=core,osx.<u></u>cocoa.NonNilReturnValue,osx.<u></u>cocoa.NilArg,osx.cocoa.Loops,<u></u>debug.ExprInspection -verify -Wno-objc-root-class %s<br>
<br>
 void clang_analyzer_eval(int);<br>
<br>
<br>
Modified: cfe/trunk/test/Analysis/<u></u>logical-ops.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/logical-ops.c?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/<u></u>Analysis/logical-ops.c?rev=<u></u>222009&r1=222008&r2=222009&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/test/Analysis/<u></u>logical-ops.c (original)<br>
+++ cfe/trunk/test/Analysis/<u></u>logical-ops.c Fri Nov 14 11:12:50 2014<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.<u></u>ExprInspection -verify %s<br>
+// RUN: %clang_cc1 -Wno-pointer-bool-conversion -analyze -analyzer-checker=core,debug.<u></u>ExprInspection -verify %s<br>
<br>
 void clang_analyzer_eval(int);<br>
<br>
<br>
Modified: cfe/trunk/test/Analysis/objc-<u></u>boxing.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/objc-boxing.m?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/<u></u>Analysis/objc-boxing.m?rev=<u></u>222009&r1=222008&r2=222009&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/test/Analysis/objc-<u></u>boxing.m (original)<br>
+++ cfe/trunk/test/Analysis/objc-<u></u>boxing.m Fri Nov 14 11:12:50 2014<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.<u></u>Malloc,osx.cocoa.<u></u>NonNilReturnValue,debug.<u></u>ExprInspection -analyzer-store=region -verify %s<br>
+// RUN: %clang_cc1 -Wno-objc-literal-conversion -analyze -analyzer-checker=core,unix.<u></u>Malloc,osx.cocoa.<u></u>NonNilReturnValue,debug.<u></u>ExprInspection -analyzer-store=region -verify %s<br>
<br>
 void clang_analyzer_eval(int);<br>
<br>
<br>
Modified: cfe/trunk/test/Sema/exprs.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/exprs.c?rev=222009&r1=222008&r2=222009&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/Sema/<u></u>exprs.c?rev=222009&r1=222008&<u></u>r2=222009&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/test/Sema/exprs.c (original)<br>
+++ cfe/trunk/test/Sema/exprs.c Fri Nov 14 11:12:50 2014<br>
@@ -244,6 +244,10 @@ void test22() {<br>
   if ("help")<br>
     (void) 0;<br>
<br>
-  if (test22)<br>
+  if (test22) // expected-warning {{address of function 'test22' will always evaluate to 'true'}} \<br>
+             // expected-note {{prefix with the address-of operator to silence this warning}}<br>
+    (void) 0;<br>
+<br>
+  if (&test22)<br>
     (void) 0;<br>
 }<br>
<br>
Added: cfe/trunk/test/Sema/warn-<u></u>tautological-compare.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-tautological-compare.c?rev=222009&view=auto" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/test/Sema/<u></u>warn-tautological-compare.c?<u></u>rev=222009&view=auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/test/Sema/warn-<u></u>tautological-compare.c (added)<br>
+++ cfe/trunk/test/Sema/warn-<u></u>tautological-compare.c Fri Nov 14 11:12:50 2014<br>
@@ -0,0 +1,80 @@<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify  %s<br>
+// rdar://18716393<br>
+<br>
+extern int a[] __attribute__((weak));<br>
+int b[] = {8,13,21};<br>
+struct {<br>
+  int x[10];<br>
+} c;<br>
+const char str[] = "text";<br>
+<br>
+void ignore() {<br>
+  if (!a) {}<br>
+}<br>
+void test() {<br>
+  if (!b) {} // expected-warning {{address of array 'b' will always evaluate to 'true'}}<br>
+  if (b == 0) {} // expected-warning {{comparison of array 'b' equal to a null pointer is always false}}<br>
+  if (!c.x) {} // expected-warning {{address of array 'c.x' will always evaluate to 'true'}}<br>
+  if (c.x == 0) {} // expected-warning {{comparison of array 'c.x' equal to a null pointer is always false}}<br>
+  if (!str) {} // expected-warning {{address of array 'str' will always evaluate to 'true'}}<br>
+  if (0 == str) {} // expected-warning {{comparison of array 'str' equal to a null pointer is always false}}<br>
+}<br>
+<br>
+int array[2];<br>
+int test1()<br>
+{<br>
+  if (!array) { // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+    return array[0];<br>
+  } else if (array != 0) { // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}}<br>
+    return array[1];<br>
+  }<br>
+  if (array == 0) // expected-warning {{comparison of array 'array' equal to a null pointer is always false}}<br>
+    return 1;<br>
+  return 0;<br>
+}<br>
+<br>
+#define NULL (void*)0<br>
+<br>
+int test2(int* pointer, char ch, void * pv) {<br>
+   if (!&pointer) {  // expected-warning {{address of 'pointer' will always evaluate to 'true'}}<br>
+     return 0;<br>
+   }<br>
+<br>
+   if (&pointer) {  // expected-warning {{address of 'pointer' will always evaluate to 'true'}}<br>
+     return 0;<br>
+   }<br>
+<br>
+   if (&pointer == NULL) {} // expected-warning {{comparison of address of 'pointer' equal to a null pointer is always false}}<br>
+<br>
+   if (&pointer != NULL) {} // expected-warning {{comparison of address of 'pointer' not equal to a null pointer is always true}}<br>
+<br>
+   return 1;<br>
+}<br>
+<br>
+void test3() {<br>
+   if (array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+   if (array != 0) {} // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}}<br>
+   if (!array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+   if (array == 0) {} // expected-warning {{comparison of array 'array' equal to a null pointer is always false}}<br>
+<br>
+   if (array[0] &&<br>
+       array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+<br>
+   if (array[0] ||<br>
+       array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+<br>
+   if (array[0] &&<br>
+       !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+   if (array[0] ||<br>
+       !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+<br>
+   if (array && // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+       array[0]) {}<br>
+   if (!array || // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+       array[0]) {}<br>
+<br>
+   if (array ||  // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+       (!array && array[0])) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}}<br>
+ }<br>
+<br>
+<br>
<br>
<br>
______________________________<u></u>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank" class="cremed">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div>