0

最初はコードを提供していないことをお詫びしますが、エラーは何らかの形でランダムに発生するため、抜粋を C+P するのは困難です。

C ソースを GCC でコンパイルすると、非常に奇妙なエラーが発生します。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 に答える