Для следующего кода в C:
void test(int a, int b, int c){
if(a > 1 && (b == 2 || c == 3))
b = a + c;
else
c = a + b;
return;
}
CFG выглядит следующим образом:
Но когда Я меняю if в строке 2 на while:
void test(int a, int b, int c){
while(a > 1 && (b == 2 || c == 3))
b = a + c;
c = a + b;
return;
}
Затем CFG изменяется на:
Итак, c генерируются блоки lor.end и land.end, но они не соответствуют ни одному оператору в программе. Почему while.cond не подключается к while.end напрямую, как entry -> if.else в первом CFG? Другими словами, почему генерируются lor.end и land.end? Кажется, что способ обработки коротких замыканий в операторах if отличается от такового в операторах l oop. Что вызывает эту разницу?
сценарий компиляции (calng / llvm 7.0.1): clang -emit-llvm - c -g -fno-discard-value-names имя_файла. c