NoQ marked an inline comment as done.
NoQ added a comment.

Ouch, seems inline answers don't automatically post themselves when you update 
the diff :o


================
Comment at: lib/StaticAnalyzer/Checkers/BoolConversionChecker.cpp:62
@@ +61,3 @@
+       << "' to a plain boolean value: probably a forgotten "
+       << (IsObjC ? "'[boolValue]'" : "'->isTrue()'");
+    BR.EmitBasicReport(
----------------
dcoughlin wrote:
> - The '[boolValue]' thing here is weird. Maybe use '-boolValue' instead?
> - How about "Comparison between 'NSNumber *' and 'BOOL'; use -boolValue 
> instead."
> - You probably want to remove lifetime qualifiers from the type with 
> `.getUnqualifiedType()`. before printing (i.e., don't mention '__strong') in 
> the diagnostic.
> 
Yeah, noticed the lifetime qualifiers. Changed messages significantly.

================
Comment at: lib/StaticAnalyzer/Checkers/BoolConversionChecker.cpp:117
@@ +116,3 @@
+    auto ConversionThroughComparisonM =
+        binaryOperator(anyOf(hasOperatorName("=="), hasOperatorName("!=")),
+                       hasEitherOperand(NSNumberExprM),
----------------
zaks.anna wrote:
> Can we use any binary operator here without any restrictions?
Comparisons are handled here. Assignments are handled in a different matcher. 
Arithmetic operators are either a valid pointer arithmetic (such as `+` or `-`) 
or cause compile errors (such as `*` or `/`). Bitwise ops (`&`, `>>`, etc.) - 
perhaps somebody is computing shadow memory. Logical ops - also too commonly 
intentional (typically: `if (p && [p boolValue])`). Comma operator - ouch, we 
should probably warn about the very fact that somebody uses comma operators.

================
Comment at: test/Analysis/bool-conversion.cpp:18
@@ +17,3 @@
+#ifdef PEDANTIC
+  if (p) {} // expected-warning{{}}
+  if (!p) {} // expected-warning{{}}
----------------
zaks.anna wrote:
> dcoughlin wrote:
> > It is generally good to include the diagnostic text in the test for the 
> > warning. This way we make sure we get the warning we expected.
> +1
> 
> Are these pedantic because we assume these are comparing the pointer and not 
> the value? Have you checked that this is a common idiom?
> 
> Same comment applies to NSNumber. If it is common practice to compare against 
> nil..
> 
> Are these pedantic because we assume these are comparing the pointer and not 
> the value? Have you checked that this is a common idiom?

I haven't checked if this is more popular or less popular than `if (p == nil)`, 
but it's clearly too popular and too often correct for a warning enabled by 
default.

================
Comment at: test/Analysis/bool-conversion.cpp:21
@@ +20,3 @@
+  p ? 1 : 2; // expected-warning{{}}
+  (bool)p; // expected-warning{{}}
+#endif
----------------
zaks.anna wrote:
> Why is this OK?
Will test more closely; i think this gives a lot of intentionals, but a cast to 
a non-boolean integer is clearly an error that must be reported.

================
Comment at: test/Analysis/bool-conversion.m:10
@@ +9,3 @@
+  if (!p) {} // expected-warning{{}}
+  if (p == YES) {} // expected-warning{{}}
+  if (p == NO) {} // expected-warning{{}}
----------------
zaks.anna wrote:
> dcoughlin wrote:
> > There is a Sema warning for `p == YES` already, right? ("comparison between 
> > pointer and integer ('NSNumber *' and 'int')")
> These tests seem to be even more relevant to OSBoolean.
> There is a Sema warning

Yep, but it is disabled with `-w`. I think it's a good idea to add `-w` to the 
run line in all analyzer tests - it often makes tests easier to read, and in 
particular we're sure that all warnings in the test are coming from the enabled 
checkers, not from other sources.

================
Comment at: test/Analysis/bool-conversion.m:11
@@ +10,3 @@
+  if (p == YES) {} // expected-warning{{}}
+  if (p == NO) {} // expected-warning{{}}
+  (!p) ? 1 : 2; // expected-warning{{}}
----------------
dcoughlin wrote:
> Should `p == NO` be on in non-pedantic mode, as well? It also seems to me 
> that you could warn on comparison of *any* ObjCObjectPointerType type to 
> `NO`. At a minimum it would probably be good to check for comparisons of `id` 
> to NO.
Whoops, accidental.


https://reviews.llvm.org/D22968



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to