1. ホーム
  2. c

[解決済み] Cのmallocのアサーションに失敗するのはなぜですか?

2022-02-28 22:23:39

質問

OpenCLの実装に対してベンチマークを行うために、分割統治多項式アルゴリズムを実装しているのですが、その際に malloc が動作するようになりました。プログラムを実行すると、たくさんのものが割り当てられ、いくつかのものがチェックされ、それから size/2 をアルゴリズムに渡す。そして、私が malloc の行をもう一度書くと、このようになります。

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted

問題の行は

int *mult(int size, int *a, int *b) {
    int *out,i, j, *tmp1, *tmp2, *tmp3, *tmpa1, *tmpa2, *tmpb1, *tmpb2,d, *res1, *res2;
    fprintf(stdout, "size: %d\n", size);

    out = (int *)malloc(sizeof(int) * size * 2);
}

でサイズを確認しました。 fprintf で、それは正の整数(その時点では通常50)です。 を呼び出してみました。 malloc をプレーンな数字で入力しても、やはりエラーになります。 Googleで調べても何も出てこないし、どうしたものかと困っています。

何か思い当たることはありますか? コンパイラのエラーであることを想定して、新しいGCCをコンパイルする方法を考えているのですが、本当にそうでしょうか。

解決方法は?

99.9%の確率でメモリが破損しています(バッファのオーバーフローまたはアンダーフロー、解放後のポインタへの書き込み、同じポインタに対して2回freeを呼び出す、など)。

でコードを実行します。 ヴァルグラインド をクリックすると、あなたのプログラムがどこで間違ったことをしたのかがわかります。