gpt4 book ai didi

c - 启用优化的奇怪行为

转载 作者:太空狗 更新时间:2023-10-29 16:31:04 25 4
gpt4 key购买 nike

我有一小段代码(这是我遇到的问题的最小工作示例):

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

void xorBuffer(unsigned char* dst, unsigned char* src, int len)
{
while (len != 0)
{
*dst ^= *src;
dst++;
src++;
len--;
}
}

int main()
{
unsigned char* a = malloc(32);
unsigned char* b = malloc(32);
int t;

memset(a, 0xAA, 32);
memset(b, 0xBB, 32);

xorBuffer(a, b, 32);

printf("result = ");
for (t = 0; t < 32; t++) printf("%.2x", a[t]);
printf("\n");

return 0;
}

这段代码应该执行两个 32 字节内存缓冲区的异或(从概念上讲,这应该执行 a = a ^ b)。由于 0xAA ^ 0xBB = 0x11,它应该打印“11”三十二次。

我的问题是,当我在 MinGW-GCC (Windows) 下编译它时,它在 Debug模式下运行良好(无优化),但当启用从 -O3 开始的优化时,在 xorBuffer 循环中途因 SIGILL 崩溃。此外,如果我将 printf 放入有问题的循环中,它会再次完美运行。我怀疑堆栈损坏,但我只是看不出我在这里做错了什么。

尝试在启用优化的情况下使用 GDB 进行调试是失败的原因,因为所有 GDB 都向我展示了每个变量的“变量优化输出”(当然,如果我尝试输出一个变量,它会突然起作用) .

有人知道这是怎么回事吗?我在这个问题上思考了太久,我真的需要妥善解决它才能继续前进。我的猜测是我缺少一些基本的 C 指针知识,但对我来说代码看起来是正确的。它可能来自缓冲区递增,但据我所知,sizeof(unsigned char) == 1,因此它应该逐个逐个字节地进行。

就其值(value)而言,即使在我的 Linux 机器上对 GCC 进行了优化,该代码也能正常工作。

那么……这是怎么回事?谢谢!

按要求,整个程序的汇编输出:

使用-O2:clicky

使用-O3:clicky

我在 GCC 4.6.2(与 MinGW 一起运行)上观察到这种行为

最佳答案

来 self 的评论:

确保编译器具有关于目标架构的正确信息。看来,从阅读-O3输出,编译器正在为您设置 SIMD 优化,它实际上通过使用 vector 指令(例如 <a href="http://www.jaist.ac.jp/iscenter-new/mpc/altix/altixdata/opt/intel/vtune/doc/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc183.htm" rel="noreferrer noopener nofollow">movdqa</a> )使代码更加并行。如果目标处理器与编译器发出代码的目的不 100% 匹配,您最终可能会得到非法指令。

关于c - 启用优化的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com