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.

Reply via email to