不同的输出调用clang上的malloc应用编译器选项-00和-03
Different output calling malloc on clang applying compiler options -00 vs -03
以下代码运行编译器选项-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
是无效指针。该标准将realloc
和free
视为解除分配例程,如果成功,则指针所在的地址将不再使用。如果对realloc
的调用由于某种原因失败,那么原始内存仍然有效(当然q
不是,它是NULL)。
尽管您比较了p
和q
,但您已经写入了一个无效的指针,所以所有的赌注都是无效的
这里可能发生的是O3
设置导致编译器忽略指针,只替换内联数字。高度优化意味着编译器可以采取各种捷径并忽略语句,只要它能保证相同的结果——条件是所有代码都定义良好。
相关文章:
- 如何编译使用从不同编译器编译的库的应用程序?
- 如何使用CLion和MSVC编译器工具链编译wxWidgets Hello World应用程序而没有错误?
- 是否可以将不同的编译器嵌入到我的应用程序中?
- C++使用较新的编译器构建应用程序,而无需重新构建库
- RVO 何时保证应用/确实适用于 C++20 编译器
- 是否可以在 Azure 应用服务中安装 C++ 编译器
- [expr.unary.op]/9 似乎暗示"运算符!()' 不能应用于下面的类型 A.但编译器不同意这一点
- GCC编译器,为较低版本的GCC编译应用程序
- 如何将我的控制台应用程序链接到使用 clang++ 作为编译器的 OSX 环境中的 /usr/local/lib 中存在
- 如何从我的qt应用程序运行gcc编译器?
- 将 const 限定符应用于模板参数时的不同编译器行为
- 尝试使用VC++编译器构建Qt应用程序:"type_traits":没有这样的文件或目录
- 如何安全地部署使用升级的编译器构建的应用程序
- 不同的输出调用clang上的malloc应用编译器选项-00和-03
- 使用英特尔编译器套件编译 OpenMPI 应用
- CL.exe 构建通用应用程序时编译器和库版本不匹配
- 从沙盒应用程序运行clang编译器的任何可能方式
- c++应用程序找不到com dll,因为编译器使用不正确的guid生成.tlh文件
- 要求编译器内联我的类并应用通常的优化
- 是否有可能使用各种编译器应用程序访问iOS上的文件?