静的コードアナライザーについての意見は残念です

静的コード分析ツールははるかに進んでいます。これらは、20年前に積極的に使用された「リンター」ではありません。ただし、多くの人は依然としてそれらを非常に単純なツールと呼んでいます。それは残念だ。一般的なコード分析の方法論とPVS-Studioツールの両方にとって残念です。







悲しみの理由は、私たちの記事の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'は常に真です。



プログラマーは心配する必要はありません。最新のツールは高度であり、本当に疑わしいコードに対してのみ警告を発行します。誤検知がありますが、原則として、それらは紛らわしいコードの存在に関連しており、人でも理解するのが難しい場合があります。





追加のリンク







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



All Articles