Почему компилятор gcc ведет себя по-разному в этих двух случаях? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть два одинаковых цикла 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 Ответ

0 голосов
/ 23 ноября 2018

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

...