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

Different output calling malloc on clang applying compiler options -00 vs -03

本文关键字:编译器 应用 选项 malloc 上的 输出 调用 clang      更新时间:2023-10-16

以下代码运行编译器选项-O3-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上测试它似乎效果不错。

realloc之后,p不再有效。

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

尽管您比较了pq,但您已经写入了一个无效的指针,所以所有的赌注都是无效的

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