[clang] [clang][dataflow] Strengthen pointer comparison. (PR #75170)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 24 04:56:00 PST 2024


martinboehme wrote:

Finally getting back to this.

The reason this was causing tests to fail is really pretty obvious in hindsight: Different `StorageLocation`s may alias, so if the `StorageLocation`s for two `PointerValue`s are different, we can't assume that the pointers must compare unequal.

Here's an example:

```cxx
void f(int *p1, int *p2) {
  if (p1 == p2) {
    do_something();
  }
}
```

The framework initializes `p1` and `p2` with different storage locations, so the current state of this PR causes the comparison `p1 == p2` to be evaluated to a false literal, which in turn causes the `do_something()` block to be considered dead code. But this is nonsense: `p1` and `p2` may alias, so it's definitely possible that `do_something()` will be executed.

In summary, if the storage locations for two pointers are the same, we can return a true literal for the comparison, but if the storage locations are different, we need to return an atom.

I'll change the PR accordingly and will let you know once it's ready for another look.

https://github.com/llvm/llvm-project/pull/75170


More information about the cfe-commits mailing list