首先请原谅我没有提供任何代码,但很难将C + P作为摘录,因为错误是以某种方式随机引起的。
在使用GCC编译C源代码时遇到一个非常奇怪的错误。我正在为Erlang开发一个链接驱动程序,我不明白导致错误的原因。错误是这样的:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffb012aae8
[Switching to process 7316 thread 0x1503]
ktqk_exec (query=0x13e0af00, table=0x13e00ea0) at ktqk.c:215
215 clock_t start = clock();
我正在运行用GDB包装的Erlang虚拟机,所以我可以访问内存部分。对我而言,高地址0xffffffffb012aae8
看起来非常可疑。但是,Clang的一切都按预期工作,没有错误,没有段错误。我试着调查:
(gdb) p clock
$1 = {<text variable, no debug info>} 0x7fff85c29fd0 <clock>
(gdb) p start
$2 = 2954013712
因此该值显然未初始化,之前崩溃了。当我在同一个文件中设置断点时,只需跳过它们。为什么一切都适用于Clang,而不是GCC?
由于Clang默认使用C99和GCC C89,我必须在GCC上包含-std=c99
标志以进行编译。这可能是潜在的来源吗?但是,当我注释掉上面的代码时,它会在下一个函数调用时失败。所以它似乎与函数调用有关。尽管如此,此行之前的所有函数调用都没问题。
一个非常奇怪的错误。有人有什么想法吗?对于这个相当模糊的解释感到抱歉,我根本不理解错误。
一切顺利, 马丁
答案 0 :(得分:0)
我可以回答我自己的问题:导致错误的代码可以在下面找到:
...
int select = -1;
for (int p = 0; p < SIZE_KEYS; p++)
if (parts[p] == query->count && (select == -1 || sizes[p] < sizes[select]))
select = p;
int *index[lists[select]];
if (select != -1) {
...
}
...
所以select
被初始化为-1,如果找到了某些东西,那就是> 0
。现在,在我的例子中没有找到任何东西,所以select = -1
。将-1放在lists
中,结果也是lists[select] = -1
,因此显然与select
的内存区域相同。但是,现在我们正在初始化一个大小为-1的整数指针列表。这显然是错误的。
为什么Clang不抱怨这个严重的错误!?