3

バッファ オーバーフローのリスクがあると思われる strcpy コマンドの例がありますが、PVS-Studio は警告を発しません。私の例では、コマンド ライン引数のサイズをチェックせずに、strcpy を使用してコマンド ライン引数をバッファーにコピーしています。これにより、引数がバッファのサイズを超えると、バッファ オーバーフローが発生する可能性があります。

コード例:

char carg1[13];
int main(int argc, char* argv[])
{
// Get name from the 1st command line arg
       strcpy(carg1, argv[1]);
…
}

argv[1] のサイズは、carg1 に対処する前にチェックされません。これは警告を発するべきではありませんか?

4

2 に答える 2

4

完全な静的分析ツールを構築することは理論的に不可能です(これは、停止問題の決定不能性などの結果に基づいています)。その結果、すべての静的分析ツールは、せいぜい特定のクラスのエラーを検出しようとするヒューリスティックであり、それでも必ずしもすべてのエラーを検出できるとは限りません。

そうです、上記のコードはバッファオーバーフローの可能性があるように見えます。この特定のツールがエラーを検出できない理由は正直にわかりませんが、アナライザーが何らかの理由で使用する内部ヒューリスティックがエラーを検出できないと推測しています。

お役に立てれば!

于 2013-02-11T17:10:59.387 に答える
1

3 つの事実があります。

1) Visual C++ コンパイラを使用すると、コンパイラ警告 4996 が表示されます。

1>robust.cpp(529): 警告 C4996: 'strcpy': この関数または変数は安全でない可能性があります。代わりに strcpy_s の使用を検討してください。非推奨を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳細については、オンライン ヘルプを参照してください。1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\string.h(110) : 「strcpy」の宣言を参照

2) PVS-Studio は当初、Visual Studio のみで動作していました。

3) PVS-Studio のポリシーは、コンパイラの警告が重複しない診断ルールを実装することです。

そのため、Microsoft コンパイラによって長い間 (VS2005 から) 既にチェックされていたケースを PVS がチェックしないのは当然のことのようです。

更新: 最後に、PVS はそのような診断ルールを実装しました: https://www.viva64.com/en/w/V755/print/

于 2017-03-13T16:30:01.810 に答える