4

環境

クロスプラットフォーム ライブラリのValgrindコードベースで実行しています。Linuxこれで十分かどうか、または動的コード分析を実行する必要があるかどうかを確認しようとしていWindowsますMac

質問

プラットフォームに依存しないC++ コードがLinux( に従って) リークしていない場合、それもリークしてValgrindいないと仮定できますか? 「いいえ」の場合は、プラットフォームに依存しない C++ サンプルを提供してください( によると)リークしていませんが、および/または(VC++、GCC などの「一般的な」コンパイラを選択してください) でリークしています。WindowsMacLinuxValgrindWindowsMac

精度(コメントと回答のおかげ)

  1. プラットフォームに依存しない C++ コードに興味があります (したがって、#ifdef などはありません)。
  2. サードパーティのコードではなく、私が所有する C++ コードを考慮します。
  3. 私は Valgrind をグラウンド トゥルースと考えていますが、他のツールを検討することもできます。すべてのメモリ リークを検出できるツールはありません。
4

3 に答える 3

3

一般的なコードがリークしていないことはかなり確信で​​きますが、もちろん、適切なサイズのアプリケーションがある場合、コードの一部が Linux に固有であり、その他の部分が Windows に固有であり、一部が OS に固有である可能性が非常に高くなります。バツ。

Linux に固有ではない部分は、もちろん Valgrind によってテストされません。

したがって、次のようなコードがある場合:

#if LINUX
 char buffer[512]; 
#else
  char buffer = new buffer[2048]; 
#endif
  ... use buffer ... 

Windows ではメモリ リークが発生しますが、Linux では発生しません。

明らかに、これは些細な例ですが、同様のことがコードに忍び寄ることがあります。

そしてもちろん、あるOSで何らかのシステムコールを使用すると、閉じたり、「終了したことをOSに伝えたり」するのが「安全」であり、別のOSで問題が発生する可能性があります。

また、前に指摘したように、Valgrind はメモリ使用量に問題がないことを保証しません。次のようなもののみを検出します。

 void func()
 {
     char *p = new [1700];
     ... 
     // no free of p;
 }

また

 void func()
 {
     char *p = new [1700];
     ... 
     // No free. 
     p = some_other_pointer; 
     ... 
 }

だがしかし:

 void func()
 {
    vector<int> v;
    for(;;)
       v.push_back(1); 
 }

メモリはまだ何かによって「所有」されているためです。もちろん、この特定の例は非常に極端ですが、コードが何かを格納し、ストレージにアイテムをどんどん追加し、それらを決して削除しないという同様のことができます。

于 2013-08-29T09:33:29.007 に答える
3

valgrind欠陥を見つけるのに役立ちますが、正確性を保証するものではありません。

コード内で未定義の動作が引き続き発生する可能性があり、その未定義の動作は、一方ではメモリ リークが発生するが他方では発生しないなど、プラットフォームによって異なる形で現れる可能性があります。

于 2013-08-29T09:28:42.133 に答える
1

条件付きでコンパイルされたコード (例: #if defined (OS_LINUX)) がある場合は、各プラットフォームでリークがないことを確認する必要があります。

注:これは完全な答えではなく、私が考えたケースです。

于 2013-08-29T09:27:56.147 に答える