[PATCH] D66397: [Diagnostics] Improve -Wxor-used-as-pow

Bruno Ricci via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 22 06:52:12 PDT 2019


riccibruno added a comment.

> This should not warn. Please verify that patch was applied correctly and you use newly built clang with this patch. (I use arc patch DXXXXX)

You were right, I messed up on my side. Sorry about the noise !

I don't have much to add to the macro yes/no discussion but I have added some inline comments.



================
Comment at: lib/Sema/SemaExpr.cpp:9449
+  }
+
+  if (LHSInt->getValue().getBitWidth() != RHSInt->getValue().getBitWidth())
----------------
This will miss literals with a unary +, like `10 ^ +8`. I am not finding any code sample on `codesearch.isocpp.org` with this pattern, but you could imagine someone writing code like :


```
#define EXPONENT 10

res1 = 10 ^ +EXPONENT;
res2 = 10 ^ -EXPONENT;
```

WDYT  ?


================
Comment at: lib/Sema/SemaExpr.cpp:9469
+  const llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
+
+  std::string LHSStr = Lexer::getSourceText(
----------------
You could bailout early if the values are such that no diagnostics is ever going to be issued, before doing any source range/string manipulations (ie: do all the tests on the values first).


================
Comment at: lib/Sema/SemaExpr.cpp:9506
+    return;
+
+  bool SuggestXor = S.getLangOpts().CPlusPlus || S.getPreprocessor().isMacroDefined("xor");
----------------
Maybe put the slightly more expensive `find` last in the condition.


================
Comment at: lib/Sema/SemaExpr.cpp:9674
+                            RHS.get());
+
   // Enforce type constraints: C99 6.5.6p3.
----------------
I think that this will miss code like `(2 ^ 64) - 1u` since `IgnoreParens()` will not skip any implicit casts added by `UsualArithmeticConversions`. (Also `IgnoreParens()` skips a bunch of other things, but it does not seem relevant here).

Also, in `CheckBitwiseOperands` `diagnoseXorMisusedAsPow` is called before `UsualArithmeticConversions` and not after. I am wondering if it is possible for `diagnoseXorMisusedAsPow` to be called with invalid arguments in `CheckBitwiseOperands` ?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66397/new/

https://reviews.llvm.org/D66397





More information about the cfe-commits mailing list