2011-07-07 9 views
1

私は多くの学生割り当てを採点しています。正しい配列の長さがCでmallocedされているかどうかを調べる

彼らは独自の動的配列データ型を設計しています。私は、サイズ変更時に配列の正しい量のメモリがmallocされることを確認するための良い方法を探しています。

malloc呼び出しで作成されたメモリの量を簡単にテストする方法がいくつかあります。彼らは容量を把握することになっていますが、正しく機能していることをテストする必要があります。

他のテストを続行できるように十分なメモリを割り当てなかった場合、テストがsegfaultで終了しない場合は、私も好きです。

ありがとうございます!

+3

「malloc」の独自の実装を提供し、それにリンクさせますか?またはvalgrindを通じてコードを実行しますか? – jamesdlin

+0

あなたが何を求めているのか分かりません。それが正しくmallocされているかどうかをチェックするように、各生徒の課題にコードの行を入れたいですか? –

+2

[ここでmallocをラップするためのカップルのメソッド](http://stackoverflow.com/questions/262439/create-a-wrapper-function-for-malloc-and-free-in-c) – jspcal

答えて

4

malloc(),calloc(),realloc()およびfree()の独自のバージョンを、標準の関数名を再定義することでテスト用に提供できます。 gccで

、私は、交換機能

gcc -c myfunctions.c -omyfunctions.o 

を持つオブジェクトファイルを作成し、交換

gcc myfunctions.o -Dmalloc=mymalloc -Dcalloc=mycalloc -Drealloc=myrealloc -Dfree=myfree testfile.c 

の代わりに、どのような学生にredefinitonとのリンクを使用してテストファイルをコンパイルしたいですuse

gcc testfile.c 

my*() functioの実装nsはあまりにも難しいはずがありません。基本的には、パラメータをチェックして元の関数を呼び出します。

/* myfunctions.c */ 
#include <stdlib.h> 
void *mymalloc(size_t s) { 
    /* test s */ 
    return malloc(s); 
} 
void *mycalloc(size_t n, size_t s) { 
    /* test n and s */ 
    return calloc(n, s); 
} 
void *myrealloc(void *p, size_t s) { 
    /* test p and s */ 
    return realloc(p, s); 
} 
void myfree(void *p) { 
    /* test p */ 
    free(p); 
} 
+0

これを行う最も簡単な方法です。学生がこの作業を停止するコードを書くことができれば、おそらく他の何か間違っていることでしょう。彼らが独自の 'mymalloc'の関数を呼び出すのが妥当であるという議論の余地がある例外があるので、名前に擬似ランダム文字列をつけたり、ちょうど起こった' __mymalloc'のような予約名を使用してくださいあなたの実装が何にも使われていないことを知ってください。 –

+0

マクロを最初に定義し、次にそれらを定義解除する必要があります。私は '-U'オプションなしでテストを正しくコンパイルすることができませんでした。 – pmg

+0

ああ、それは考えていませんでした。精神的には、学生一人ではなく、私が 'myfunctions.c'を別々に集めたと思います。 –

1

あなたが予想している問題は、Valgrindの学生のプログラムを実行することによって捕らえるべきだと思います。とにかく、他の望ましくない問題を起こす可能性があるので、これはいい考えです。範囲外のアクセス。

+0

+1:IMHO、これは正しい答えです。特定の入力条件を期待するためにmallocをラップしようとするのではなく、既存のツールを使用して不正なメモリアクセスが発生していないことを確認するだけです。 –

+0

@Oli:tbh私は 'malloc' *と* valgrindを嘲笑すべきだと思っています。 valgrindには間違いがありますが、学生が常に同じサイズのバッファを使用して、すべてのテストケースで十分な大きさになるような模擬テストは可能です:-) –

関連する問題