NoQ added a comment.
In D56632#1359576 <https://reviews.llvm.org/D56632#1359576>, @xazax.hun wrote:
> If you find out the reason why we need `markElementIndicesLive`, documenting
> that would also be useful. But it is also independent of this change.
> Maybe something like we could learn new information regarding the indices
> after they are dead?
> Like:
>
> void f(int i, char *c) {
> char e = c[i];
> if (strlen(c) == 5) {
> // The value of `i` is no longer used, could be dead
> // but we did learn something new. Assuming no UB, `i <= 5` (if
> null terminated).
> // So maybe having symbols for indices around for representing the
> info above is useful?
> use(c);
> }
> }
>
Yep, that was pretty much the original motivation behind adding this
functionality in D12726 <https://reviews.llvm.org/D12726>.
A more ridiculous example:
struct rlimit rlim;
getrlimit(RLIMIT_NOFILE, &lim); // Max file descriptor on the system.
int *arr = calloc(rlim.rlim_cur, sizeof(int)); // An expensive but fast map
from FDs to ints.
arr[open("foo.txt", O_RDONLY)] = 1; // Remember that this descriptor is open.
After that even though the file descriptor is otherwise dead, as long as `arr`
is alive and its contents are more or less preserved, you can close the file as
follows:
for (int i = 0; i < rlim.lim_cur; ++i)
if (arr[i] == 1)
close(i);
Therefore, we kinda should not diagnose a file descriptor leak here.
> One fundamental question is, do we have one property here or two?
> Maybe the liveness analysis we use for leaks (and other purposes?),
> and the garbage collection of symbols are inherently two different kind of
> things that are only slightly related?
This constantly bothers me, but surprisingly, i don't see any reasonable
counter-examples to them being the same thing.
One of the brightest examples i have is that if the parent region of a
`LazyCompoundVal` is an `ElementRegion` with symbolic index, constraints on its
index ideally need to be kept alive in order to access the data within the
`LazyCompoundVal` as accurately as possible, but it's not really accessible
from within the program because the parent region of a `LazyCompoundVal` is
entirely immaterial. However, this is merely a weird implementation detail of
our `LazyCompoundVal`s: we could have implemented "eager" compound values
instead, and in that case it wouldn't have been a problem anymore. Note that it
is not a sufficient solution to simply make `LazyCompoundVal` capture
constraints together with the store, because constraints might have improved
since then (and then dropped, and only then we're trying to load the value).
So i believe that as long as our state is not over-saturated with information
(i.e., it looks kinda like a normalized database), then the amount of
information we need to track is going to be exactly as much as the programmer
is able to extract from memory in run-time.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56632/new/
https://reviews.llvm.org/D56632
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits