100

分割統治多項式アルゴリズムを実装しているので、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をコンパイルする方法を見つけようとしていますが、本当に疑問です。

4

8 に答える 8

113

99.9%は、メモリが破損している可能性があります(バッファのオーバーフローまたはアンダーフロー、解放後にポインタへの書き込み、同じポインタで2回の解放と呼ばれるなど)

Valgrindでコードを実行して、プログラムがどこで間違ったことをしたかを確認します。

于 2010-06-07T05:20:19.287 に答える
2

おそらくどこかで割り当てられたmemを超えてオーバーランしています。次に、mallocを呼び出すまで、基になるswはそれを取得しません

mallocによってキャッチされているガード値が破壊されている可能性があります。

編集...境界チェックのヘルプのためにこれを追加しました

http://www.lrde.epita.fr/~akim/ccmp/doc/bounds-checking.html

于 2010-06-07T06:25:20.760 に答える
2

あなたのメッセージに似た、次のメッセージを受け取りました。

    プログラム: malloc.c:2372: sysmalloc: アサーション `(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)' が失敗しました。

malloc を使用するときに、以前にいくつかのメソッド呼び出しを間違えました。unsigned char 配列にフィールドを追加するときに sizeof() 演算子の後に係数を更新すると、誤って乗算記号「*」が「+」で上書きされていました。

私の場合、エラーの原因となるコードは次のとおりです。

    UCHAR* b=(UCHAR*)malloc(sizeof(UCHAR)+5);
    b[INTBITS]=(何らかの計算);
    b[BUFSPC]=(何らかの計算);
    b[BUFOVR]=(何らかの計算);
    b[BUFMEM]=(何らかの計算);
    b[MATCHBITS]=(何らかの計算);

後で別の方法で malloc を再度使用したところ、上記のエラー メッセージが表示されました。呼び出しは(非常に単純です):

    UCHAR* b=(UCHAR*)malloc(sizeof(UCHAR)*50);

最初の呼び出しで「+」記号を使用すると、(配列に割り当てられていないメモリを上書きする) 後に配列の初期化と組み合わせて計算ミスが発生し、malloc のメモリ マップに混乱が生じると考えてください。したがって、2 番目の呼び出しは失敗しました。

于 2016-10-31T14:45:22.583 に答える
0

私は同じ問題を抱えていました。新しい char *string データを追加するループで、malloc over n を繰り返し使用しました。私は同じ問題に直面しましたが、割り当てられたメモリのvoid free()問題を解放した後、ソートされました

于 2017-04-26T17:53:34.610 に答える
0

sizeof(int) を掛け忘れたため、このエラーが発生しました。malloc(..) の引数はバイト数であり、機械語の数などではないことに注意してください。

于 2011-05-02T23:42:36.550 に答える
-1

Linux を介して Visual C から gcc に 1 つのアプリケーションを移植していましたが、同じ問題がありました。

malloc.c:3096: sYSMALLOC: UBUNTU 11 で gcc を使用したアサーション。

同じコードを Suse ディストリビューション (他のコンピューター上) に移動しましたが、問題はありません。

問題は私たちのプログラムではなく、独自の libc にあると思われます。

于 2012-02-05T00:03:10.000 に答える