【发布时间】:2016-06-15 03:57:31
【问题描述】:
C/C++ 编译器(clang、gcc 等)似乎产生了与优化级别相关的不同 输出。您也可以查看这篇文章中包含的在线链接。
http://cpp.sh/5vrmv(将输出从无更改为 -O3 以查看差异)。
根据以下代码,有人可以解释我的几个问题:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = (int *)malloc(sizeof(int));
free(p);
int *q = (int *)malloc(sizeof(int));
if (p == q) {
*p = 10;
*q = 14;
printf("%d", *p);
}
return 0;
}
- 是否确定执行将始终进入 if 语句?我们怎么知道 p 和 q 这两个指针的地址是一样的?
- 为什么同样的指令无优化输出14,而-O3输出10?
【问题讨论】:
-
至少在这里
*p = 10;你有未定义的行为。不,不能保证malloc()会重复使用释放的地址。 -
“但是为什么两个不同的优化级别之间是一致的?” 未定义的行为意味着任何事情都可能发生,包括你的观察。
-
@MikhailT.:
==的结果是实现定义的。没有什么能阻止实现返回true,然后仍然将两者视为不同。 -
@MikhailT。标准中甚至有一条注释明确解决了这个问题:
[basic.stc.dynamic.safety]:"[注意:使用无效指针值(包括将其传递给释放函数)的效果是未定义的。即使不安全派生的指针值也是如此。可能比较等于某个安全派生的指针值。—end note ]" -
@TartanLlama 不,因为不确定的值可能是陷阱表示,访问它是未定义的行为。 (对于 C 来说也是如此)
标签: c++ c optimization compilation compiler-optimization