最近在我从事的一个项目中“修复”了一个错误,但到目前为止,没有人能够解释为什么该修复有效。 (那么这真的是一个解决办法吗?) 该代码在实时系统下的内核空间中运行,因此该问题会导致系统完全锁定。这也使得调试比平常更困难。
此版本会使系统崩溃:
int dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
此版本不会崩溃
int dups[EMCMOT_MAX_AXIS];
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}
更令人困惑的是,这个实验版本还会崩溃
int dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}
您可以在此处查看提交和周围的代码: https://github.com/LinuxCNC/linuxcnc/commit/ef6f36a16c7789af258d34adf4840d965f4c0b10
最佳答案
感谢Nate Eldredge用于设置编译器资源管理器和 0andriy对于 %xmm0
指针。这看起来确实像是编译器对内核代码使用不安全寄存器的问题(或一些密切相关的问题)。通过 Godbolt 站点进行实验,我发现 -mno-sse2
编译器标志在删除 $xmm0
寄存器的使用方面与切换到 gcc-6 具有类似的效果在该代码中。而且,当添加到实际应用程序编译中的编译器标志时,它似乎可以解决该问题。可能还需要做更多的工作才能找到正确的解决方案,但我们现在似乎有了一些很好的指导。
关于c - 当数组在声明时初始化时,什么会导致 C 代码崩溃,但如果通过循环清零则不会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60589636/