[PATCH] D81254: [analyzer] Produce symbolic values for C-array elements
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 10 11:15:39 PDT 2020
steakhal added a comment.
In D81254#2122449 <https://reviews.llvm.org/D81254#2122449>, @ASDenysPetrov wrote:
> @NoQ, thanks for the examples.
>
> I didn't get the first one. How do you get to the "//In reality we don't know//", if we don't touch `a[index1]`:
If `index1` and `index2` has the **same** value, we should not be confident that the `x == y` holds.
> void foo(int *a); // Potentially modifies elements of 'a'.
> void fooRef(int *&a); // Potentially modifies elements of 'a'.
>
> void test2(int *a) {
> // a - &SymRegion{reg_$6<int * a>}
> foo(a); // after this, CSA doesn't change a.
> // a - &SymRegion{reg_$6<int * a>}
> fooRef(a); // after this, CSA changes a.
> // a - &SymRegion{conj_$10{int *, LC1, S925, #1}}
> }
I don't think this is the right way expressing this.
AFAIK this means that we //don't// know where the resulting pointer points to - which is not true.
We know where it points to (aka. the pointer's value is conjured), but we don't know what the value if there.
Unfortunately, I don't know the solution to your problem, but I'm pretty confident that this is something else.
However, I'm really interested in where this discussion goes.
---
I feel like this problem should be handled by some sort of invalidation mechanism.
Take my comments on these with a pinch of salt though - I'm really not experienced in this :|
================
Comment at: clang/test/Analysis/PR9289.cpp:13-21
+int index_int(const int *a, int index) {
+ int var;
+ int ret = 0;
+ if (a[42] < 2)
+ var = 1;
+ if (a[42] < 2)
+ ret = var; // no warning about garbage value
----------------
Why do we test this?
Here we can //reason// about the index.
This patch preserves the current behavior relating to this.
================
Comment at: clang/test/Analysis/PR9289.cpp:36-40
+ if (a[index] < 2)
+ var = 1;
+ index = index2;
+ if (a[index] < 2)
+ ret = var; // expected-warning{{Assigned value is garbage or undefined [core.uninitialized.Assign]}}
----------------
I'm not sure why do you overwrite the `index` if you could simply index with `index2` instead in the following expression. That would make no difference, only make the test more readable IMO.
Same comment for all the`*_change` test cases.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D81254/new/
https://reviews.llvm.org/D81254
More information about the cfe-commits
mailing list