Почему компилятор gcc ведет себя по-разному в этих двух случаях?
У меня есть два одинаковых цикла while, и мне любопытно, почему компилятор C ведет себя по-разному в каждом случае. Подробности: Компилятор: x86-64 gcc 8.2 Опции: -O3
void use()
{
int* ptr;
while (*ptr == 6);
}
Assembly:
use:
cmp DWORD PTR ds:0, 6
jne .L1
.L3:
jmp .L3
.L1:
ret
Как видим, компилятор по-прежнему генерирует бесконечный цикл. Однако, если я использую это:
void use()
{
int p;
while (p == 6);
}
Assembly:
use:
ret
Я ожидал, что они оба не будут генерировать цикл while. Я предполагаю, что для 1-й версии, поскольку мы не можем знать, на что указывает ptr, мы не можем ничего предположить о *ptr. Но можем ли мы сделать аналогичный аргумент для 2-й версии, где p - просто локальная переменная, то есть p может содержать что-нибудь?
1 ответ
Решение
Обе версии имеют неопределенное поведение, потому что вы обращаетесь и читаете неинициализированные переменные. Таким образом, компилятор может генерировать любой код.