NoQ added inline comments.

================
Comment at: lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:511
+           SSE->getLHS()->getType()->isSignedIntegerOrEnumerationType() ||
+           SSE->getLHS()->getType()->isPointerType()) {
+          return negV->Negate(BV, F);
----------------
baloghadamsoftware wrote:
> NoQ wrote:
> > baloghadamsoftware wrote:
> > > NoQ wrote:
> > > > Pointer types are currently treated as unsigned, so i'm not sure you 
> > > > want them here.
> > > For me it seems that pointer differences are still pointer types and they 
> > > are signed. (The range becomes negative upon negative assumption. From 
> > > test `ptr-arith.c`:
> > > 
> > > ```
> > > void use_symbols(int *lhs, int *rhs) {
> > >   clang_analyzer_eval(lhs < rhs); // expected-warning{{UNKNOWN}}
> > >   if (lhs < rhs)
> > >     return;
> > >   clang_analyzer_eval(lhs < rhs); // expected-warning{{FALSE}}
> > > 
> > >   clang_analyzer_eval(lhs - rhs); // expected-warning{{UNKNOWN}}
> > >   if ((lhs - rhs) != 5)
> > >     return;
> > >   clang_analyzer_eval((lhs - rhs) == 5); // expected-warning{{TRUE}}
> > > }
> > > ```
> > > 
> > > If I put `clang_analyzer_printState()` into the empty line in the middle, 
> > > I get the following range for the difference: `[-9223372036854775808, 
> > > 0]`. If I replace `int*` with `unsigned`, this range becomes `[0, 0]`, so 
> > > `int*` is handled as a signed type here.
> > Umm, yeah, i was wrong.
> > 
> > *looks closer*
> > 
> > `T` is the type of the difference, right? I don't think i'd expect pointer 
> > type as the type of the difference.
> > 
> > Could you add test cases for pointers if you intend to support them (and 
> > maybe for unsigned types)?
> I do not know exactly the type, but if I remove the `T->isPointerType()` 
> condition the test in `ptr_arith.c` will fail with `UNKNOWN`. So the type of 
> the difference is a type that returns `true` from `T->isPointerType()`.
> 
> Pointer tests are already there in `ptr_arith.c`. Should I duplicate them?
I don't see any failing tests when i remove `T->isPointerType()`.

Also this shouldn't be system-specific, because the target triple is hardcoded 
in `ptr-arith.c` runline.

Could you point out which test is failing and dump the type in question 
(`-ast-dump`, or `Type->dump()`, or `llvm::errs() << QualType::getAsString()`, 
or whatever)?


https://reviews.llvm.org/D35110



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

Reply via email to