[PATCH] D84736: [analyzer][RFC] Handle pointer difference of ElementRegion and SymbolicRegion

Balázs Benics via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 28 14:05:55 PDT 2020


steakhal planned changes to this revision.
steakhal added a comment.

Thank you all for the comments.

In D84736#2179828 <https://reviews.llvm.org/D84736#2179828>, @NoQ wrote:

> I think the overall idea is correct.

So I will keep going in this direction, you can expect the more complex version of this.
I plan to reuse this revision.

So we can formalize this logic like this: 
//for all// `MemReg`, and `Y`: `&Element{MemReg,Y,char} - &MemReg` => `Y`



================
Comment at: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp:1059-1060
+        return UnknownVal();
+      if (Optional<NonLoc> LeftIndex = MaybeNonLocIndexOfElementRegion(LeftER))
+        return LeftIndex.getValue();
+      return UnknownVal();
----------------
NoQ wrote:
> You'll have to multiply by the size of a single element - it's an index, not an offset.
Nice catch.


================
Comment at: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp:1067-1069
+        llvm_unreachable(
+            "TODO: return the negated value of RightIndex - figure out how :D\n"
+            "Maybe a unary minus operator would do the job.");
----------------
NoQ wrote:
> Yeah, sounds like we'll have to stick to `UnknownVal` for now when `RightIndex` is symbolic. You can easily compute unary minus for a concrete index though, and that'll probably be your most important case anyway.
I managed to get around this by turning the unary minus into a binary substitution from zero (using `ArrayIndexTy` type).
Although I should have improved the `SimpleSValBuilder::minus` function to handle other svals besides concrete ints instead.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84736



More information about the cfe-commits mailing list