かなり複雑なソフトウェアを実装したところですが、学校のテスト システムでは対応できません。システムは、いわゆるマッドフラップ ライブラリを使用しており、不正なメモリ アクセスをより適切に防ぐことができます。その結果、学校のテスト システムで実行すると、私のプログラムはセグメンテーション違反を生成します (ソース コードを提出すると、テスト システムはマッドフラップ ライブラリを使用してそれをコンパイルします)。
私は自分のプログラムで問題のあるコードを分離しようとしましたが、それはすべてポインタ配列と同じくらい単純なものに要約されるようです。マッドフラップは気に入らないようです。
以下は、ポインター配列で動作する非常に単純なコードの一部です。
#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