On Saturday, 1 December 2018 at 19:02:54 UTC, H. S. Teoh wrote:
But that's precisely the problem. It's not always possible to
tell whether a variable has been initialized. E.g.:
int func(int x) {
int *p;
if (solveRiemannHypothesis()) {
p = &x;
}
...
if (solveArtinsConjecture()) {
*p++;
}
return x;
}
If you are willing to loose some precision you can still analyse
this. Google abstract interpretation.
For instance, after the first if the value of p is (&x || null).
Since the compiler can prove which branch is taken, the analyse
has to assume both are.
Inside the second if, p gets dereferenced, but since p is (&x ||
null) - that is, it might be null - that is a compile time error.
The take away is that you don't need to know what code path will
be taken, you just combine both states.