不同的输出调用malloc on clang应用编译器选项-00 vs -03

时间:2015-04-03 23:22:12

标签: c++ c gcc clang

以下运行编译器选项-O3 vs -O0的代码会产生不同的输出:

#include <stdlib.h>
#include <stdio.h>

int main(){
   int *p = (int*)malloc(sizeof(int));    
   int *q = (int*)realloc(p, sizeof(int));

   *p = 1;
   *q = 2;

   if (p == q)
     printf("%d %d", *p, *q);

   return 0;
}

我对结果感到非常惊讶。

使用clang 3.4,3.5(http://goo.gl/sDLvrq

进行编译
  • 使用编译器选项-O0 - 输出: 2 2

  • 使用编译器选项-O3 - 输出: 1 2

这是一个错误吗?

有趣的是,如果我稍微修改代码 (http://goo.gl/QwrozF)它的行为符合预期。

int *p = (int*)malloc(sizeof(int));    
*p = 1;

在gcc上测试它似乎工作正常。

2 个答案:

答案 0 :(得分:5)

realloc后,p不再有效。

答案 1 :(得分:3)

假设两个分配都成功,q指向已分配的内存区域,p是无效指针。该标准将reallocfree视为解除分配例程,如果成功,则不再使用指针所保存的地址。如果对realloc的调用由于某种原因失败,原始内存仍然有效(但当然q不是,它是空的。)

虽然您比较pq,但您已经写入无效指针,因此所有投注都已关闭。

这里发生的可能O3设置导致编译器忽略指针而只是替换内联数字。高优化意味着编译器可以采用各种快捷方式和忽略语句,只要它保证相同的结果 - 条件是所有代码都定义良好。