
悲しみの理由は、私たちの記事の1つへのコメントでした。この記事では、アナライザーが次のコードに警告を発行することでタイプミスを検出するように記述されています。
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
アナライザーは、2番目の条件が常に真であると言います。実際、関数の本体を調べると、配列の別の要素をチェックする必要があることが明らかになります。
これについて、おおよそ次のようなコメントが寄せられました。
はい、アナライザーはここでエラーを示します。しかし、一般的に、この警告は正しくありません。結局のところ、2つの同一のチェックの間で、要素の値が変わる可能性があり、2番目のチェックが意味をなします。私は悲しいです。プログラマーは、コードアナライザーは通常の式に基づいて構築されていると今でも考えています。同様に、2つの同一のネストされたifとswearが見つかりました。
当然、最新の静的アナライザーは変数の値の変化を追跡します。変数が変更されない場合は、メッセージが表示されます。変更された場合、メッセージは表示されません。このために、データフロー分析テクノロジーが使用されます。
これはまさにPVS-Studio静的アナライザーが行うことです。次の合成例を見てみましょう。
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
コードには2つの類似したブロックが含まれています。1つは、チェック対象の変数が変更されないこと、もう1つは変更されることです。したがって、アナライザは最初のブロックに対してのみ警告を発行します。V547式 'p [1] == 1'は常に真です。
プログラマーは心配する必要はありません。最新のツールは高度であり、本当に疑わしいコードに対してのみ警告を発行します。誤検知がありますが、原則として、それらは紛らわしいコードの存在に関連しており、人でも理解するのが難しい場合があります。

追加のリンク
- V547診断によって検出されたエラーの例。
- 静的解析と正規表現(なぜそれが悪い考えなのか:)。
- バグや潜在的な脆弱性を見つけるためにPVS-Studioコードアナライザーで使用されるテクノロジー。

この記事を英語を話す聴衆と共有したい場合は、翻訳リンクを使用してください:AndreyKarpov。静的アナライザーに関する動揺する意見。