0

首先请原谅我没有提供任何代码,但很难仅 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,因此我必须-std=c99在 GCC 上包含用于编译的标志。这可能是一个潜在的来源吗?但是,当我注释掉上面的代码时,它会在下一个函数调用时失败。所以它似乎与函数调用有关。尽管如此,这一行之前的所有函数调用都很好。

一个非常奇怪的错误。有人有什么想法吗?对不起,这个相当模糊的解释,我根本不理解这个错误。

一切顺利,马丁

4

1 回答 1

1

我可以回答我自己的问题:可以在下面找到导致错误的代码:

...
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) {
  ...
}
...

Soselect被初始化为 -1,如果有什么东西被发现了,它就会是> 0. 现在,在我的示例中,什么也没找到,所以select = -1. 将 -1 放入lists,结果也是lists[select] = -1,所以显然与 相同的内存区域select。然而,现在我们正在初始化一个大小为 -1 的整数指针列表。这显然是错误的。

为什么 Clang 不抱怨这个严重的错误!?

于 2012-11-13T10:48:10.287 回答