Этот предикат довольно прост, однако, его простота и даже способность работать связаны с тем фактом, что он не пытается перечислить эти точные побочные эффекты.
Clang - это только фронт конец для LLVM и не выполняет сложный анализ кода (за исключением компонента анализатора clang stati c). Основной проблемой является проблема псевдонимов , то есть попытка выяснить, на какие другие переменные может повлиять произвольная модификация указателя / ссылки.
Простой пример:
int X = 42;
int &Y = X;
Y++;
Влияет ли Y++
на X
в этом случае? - Да.
Можем ли мы это понять? - Да, если мы проследим, на что ссылается Y
.
Возможно ли это? - Вообще-то нет. Мы ограничены знаниями о текущей единице перевода. И даже если это целая программа, это займет слишком много времени, чтобы сделать точно. Есть много различных компромиссов и методов, чтобы сделать это довольно быстро и точно, но это определенно не является частью внешнего компилятора.