为什么在这两种情况下gcc编译器的行为会有所不同?

时间:2018-11-23 11:25:08

标签: c gcc while-loop compiler-optimization

我有两个类似的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循环。我的猜测是,对于第一个版本,由于我们可能不知道ptr指向什么,因此我们无法假设有关* ptr的任何内容。但是我们可以为第二版做一个类似的争论吗,其中p只是一个局部变量,即p可以包含任何东西?

1 个答案:

答案 0 :(得分:2)

两个版本都有未定义行为,因为您可以访问和读取未初始化的变量。因此,编译器可以生成任何代码。