-1

かなり複雑なソフトウェアを実装したところですが、学校のテスト システムでは対応できません。システムは、いわゆるマッドフラップ ライブラリを使用しており、不正なメモリ アクセスをより適切に防ぐことができます。その結果、学校のテスト システムで実行すると、私のプログラムはセグメンテーション違反を生成します (ソース コードを提出すると、テスト システムはマッドフラップ ライブラリを使用してそれをコンパイルします)。

私は自分のプログラムで問題のあるコードを分離しようとしましたが、それはすべてポインタ配列と同じくらい単純なものに要約されるようです。マッドフラップは気に入らないようです。

以下は、ポインター配列で動作する非常に単純なコードの一部です。

#include <stdlib.h>
int main()
{
char** rows;
rows=(char**)malloc(sizeof(char*)*3);
rows[0]=(char*)malloc(sizeof(char)*4);
rows[1]=(char*)malloc(sizeof(char)*4);
rows[2]=(char*)malloc(sizeof(char)*4);
strcpy(rows[0], "abc");
strcpy(rows[1], "abc");
strcpy(rows[2], "abc");
free(rows[0]); free(rows[1]); free(rows[2]);
free(rows);
return 0;

これにより、マッドフラップでセグメンテーション違反が発生します。私の意見では、これは完全に合法的なコードです。何が問題なのか、なぜマッドフラップでセグメンテーション違反が発生するのか説明していただけますか?

注: プログラムは、次のコマンドを使用して g++ を使用して amd64 Linux システムでコンパイルする必要があります。

    export MUDFLAP_OPTIONS='-viol-segv -print-leaks';
    g++ -Wall -pedantic -fmudflap -fmudflapir -lmudflap -g file.cpp
4

1 に答える 1

3

ここに少なくとも 1 つの問題があります。

char** rows;
rows=(char**)malloc(3);

これにより、3 バイトが割り当てられます。ほとんどのプラットフォームでは、アロケータにはおそらく少なくとも 4 バイトがあり、バッファを少し上書きする必要がありません。あなたのマッドフラップ ライブラリはチェックがより厳密で、上書きをキャッチしていると思います。

ただし、3 つのchar *ポインターの配列が必要な場合は、おそらく少なくとも 12 バイトが必要です。

これらの行を次のように変更してみてください。

char** rows;
rows=(char**)malloc(3 * sizeof(char *));

編集:変更されたコードに基づいて、今は正しいように見えることに同意します。私が提案できる唯一のことは、おそらくmalloc()失敗してNULLポインターアクセスを引き起こしているということです。そうでない場合は、マッドフラップのバグまたは設定ミスのようです。

于 2012-12-06T04:52:44.327 に答える