c - 当数组在声明时初始化时,什么会导致 C 代码崩溃,但如果通过循环清零则不会崩溃?

标签 c linux kernel-module rtai

最近在我从事的一个项目中“修复”了一个错误,但到目前为止,没有人能够解释为什么该修复有效。 (那么这真的是一个解决办法吗?) 该代码在实时系统下的内核空间中运行,因此该问题会导致系统完全锁定。这也使得调试比平常更困难。

此版本会使系统崩溃:

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/

相关文章:

linux - QEMU 在启动时挂起

linux - 尝试使用 shell 脚本查找我的机器所需的所有内核模块

c - 从函数返回字符串(字符数组、字符指针等)

c - 如果有许多具有相同参数的函数,是否应该使用宏来避免多次输入参数?

c - 如何从头开始使用 C 编写 Web 浏览器

ruby-on-rails - Docker - 无法转发交互式 shell 的端口

python - 采购 python 脚本

c - 如何禁止从 Linux 内核模块访问键盘和鼠标?

c - 内核模块中的错误处理

c - 为什么 C 编译器在外部名称前加上下划线?