web-dev-qa-db-ja.com

メモリ割り当てを単体テストできますか?

独自のメモリ割り当てルーチンを提供するライブラリをテストする必要があります。

void* allocation_routine(size_t size) throw();

ドキュメントには、この関数は少なくともsizeバイトのメモリを割り当てると記載されています(それ以上割り当てることができます)。ちなみに関数は内部でposix_memalignを使用していますが、実装は変更される可能性があります。

そのような関数の単体テストを書くことが可能かどうか疑問に思っていますか?必要な量のメモリが割り当てられたかどうかをどのようにテストできますか?

更新:

単体テストを記述できない場合、最も近いソリューションは何ですか?

14
embedc

システムコールがないとヒープにメモリを割り当てることができないため、この関数の単体テストを作成することはできません。したがって、テスト対象のユニットをオペレーティングシステムから分離できないため、これは統合テストです。

nバイトに対してallocation_routineを呼び出す新しい小さな実行可能ファイルを作成します。 allocation_routineが返すものに応じて、それがnullptrではないと断言できます。次に、nバイトをこのメモリ領域に書き込みます。 address sanitizergccclangの両方で利用可能)を使用してコンパイルしてリンクし、統合してみますアプリケーションのテストランナー(ctestなど)に追加します。

また、POSIX setrlimit を使用して使用可能なヒープを制限し、割り当てが失敗したときの動作を確認することもできます。

16
lubgr

単体テストではありませんが、Valgrindを使用してメモリに関するさまざまな情報を取得できます。

  • メモリリーク(解放されていない)
  • メモリの問題

主にデバッグに使用されますが、何かが適切に割り当てられていない場合は警告が表示されます。

0
Nicolas Roche