Почему компилятор 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 ответ

Решение

Обе версии имеют неопределенное поведение, потому что вы обращаетесь и читаете неинициализированные переменные. Таким образом, компилятор может генерировать любой код.

Другие вопросы по тегам