Проверьте, какие переменные могут быть побочные эффекты при оценке выражений в Clang AST - PullRequest
0 голосов
/ 03 февраля 2020

clang::Expr имеет функцию-член HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects). В моем случае я хочу быть более точным и знать, что, например, Expr, соответствующий Y++, повлияет только на Y, а не X. Есть ли способ сделать это?

1 Ответ

1 голос
/ 13 февраля 2020

Этот предикат довольно прост, однако, его простота и даже способность работать связаны с тем фактом, что он не пытается перечислить эти точные побочные эффекты.

Clang - это только фронт конец для LLVM и не выполняет сложный анализ кода (за исключением компонента анализатора clang stati c). Основной проблемой является проблема псевдонимов , то есть попытка выяснить, на какие другие переменные может повлиять произвольная модификация указателя / ссылки.

Простой пример:

int X = 42;
int &Y = X;
Y++;

Влияет ли Y++ на X в этом случае? - Да.

Можем ли мы это понять? - Да, если мы проследим, на что ссылается Y.

Возможно ли это? - Вообще-то нет. Мы ограничены знаниями о текущей единице перевода. И даже если это целая программа, это займет слишком много времени, чтобы сделать точно. Есть много различных компромиссов и методов, чтобы сделать это довольно быстро и точно, но это определенно не является частью внешнего компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...