
約1週間前、Habréで「
静的コードアナライザーに関する3つのインタビュー 」という記事を公開しました。この記事では、ソフトウェア開発方法論に関するAcronis、AlternativaPlatform、NGO Echelonの経験豊富なプログラマーの意見と、使用に関する彼らの考えが読者の裁判所に提示されました静的コードアナライザー。
この記事のスポンサーは
PVS-Studio静的アナライザーの開発者であるLLC Program Verだったので、Andrey Karpov(テクニカルディレクター)にいくつかの質問にも答えてもらうことにしました。 つまり、3つすべてのインタビューの興味深い瞬間についてコメントすることです。 さらに、同僚や読者にアピールします。 これは興味深い結果です。
Akronisのインタビューで注目すべき点に関する解説
ロビーまたはダイニングテーブルでの非公式なコミュニケーションの会議で、「C ++でプログラミングしている人はいますか?」と尋ねられました。 「はい、これは最もよく使われている言語の1つです」と答えたとき、本当に驚きました。 今日の聴聞会では彼が何とかしていないというだけです。 php、ruby、goの周り。 C ++は「昔ではなく、真実ではない」ようです。 そして、例えば、Acronis BackupがC ++で書かれており、70人のプログラマーが絶えず作業していることを、この記事でもう一度見てくれることを嬉しく思います。 私自身、CとC ++の将来について心配していません。 多くの人がC ++を死んだ言語だと考えるのはどうなっているかと思います。
Code ReviewがAcronisで広く使用されていることを聞いて嬉しかったです。 多くの場合、プログラムの品質を改善するこの方法は過小評価されているか、時間がかかりすぎると考えられています。 Avariciousは2回支払います。
ちなみに、sizeofにsizeofを掛けることが実際的な意味がある場合の少なくとも1つの例を知っています。 たとえば、1つのsizeof()を使用して配列内の要素数を取得すると、このような乗算が得られます。 これはこれを指します:
template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array)))
このような「配列サイズ」は、配列ではなく通常のポインタとして引数として誤って渡すことを防ぎます。 詳細は
こちら 。
その結果、フォームの構成は「sizeof(float)*(sizeof(ArraySizeHelper(array)))」となる可能性があります。 しかし、PVS-Studioアナライザーはそのような場合を認識しており、警告を発行しません。
インタビューの選択肢のハイライトに関する解説
私はJavaに精通していないため、言語がエラーからどれだけ保護されているかについてコメントすることはできません。 もちろん、手動のメモリ管理が存在しないだけで、人生は大幅に簡素化されます。 ただし、いくつかのエラーは言語に依存しないと思います。 たとえば、これらが
Copy-Paste resultsである場合 。 静的アナライザーを使用してタイプミスを見つけることは、Javaに非常に適していると思います。 しかし、ここでも、既存のコードアナライザーがJavaに提供するものがわかりません。
エシェロンNGOとのインタビューで注目すべき点に関する解説
すぐに、テキストを書く少し公式なスタイルを感じました。 どうやら、作業の詳細と準備する必要のあるドキュメントの種類が重要です。 一方では、読むのがつまらないので、私はそのようなテキストが好きではありません。 一方、私はうらやましい。 このテキストは、行われている作業の堅固さと真剣さの感覚を生み出します。 PVS-Studioにはそのようなものはありません。 PVS-Studioの使用について多くの記事を書いていますが、アナライザー自体とその重要性についてはほとんど何も書いていません。 また、PVS-Studioについての説明的な計画のソリッドテキストを作成することも必要です。
ちなみに、この機会にこのトピックを取り上げたいと思いました。 ユーザーまたは潜在的なユーザーは、PVS-Studioを脆弱性を発見できるツールとは見なしません。 わかりません。 はい、コード内でブックマークを探しているわけではありません。 ソフトウェアの脆弱性を引き起こす欠陥ではなく、バグの発見に重点を置いています。 しかし、それでも、私はそのような白と黒の区別を理解していません。 実際、多くのエラーは脆弱性と見なすこともできます。 異なる角度からエラーを見てください。
たとえば、UltimateTCPIPプロジェクトを取り上げ、PVS-Studioを使用して次のエラーを見つけます。
char *CUT_CramMd5::GetClientResponse(LPCSTR ServerChallenge) { ... if (m_szPassword != NULL) { ... if (m_szPassword != '\0') { ... }
V528「char」タイプへのポインターが「\ 0」値と比較されるのは奇妙です。 おそらく意味:* m_szPassword!= '\ 0'。 UTMail ut_crammd5.cpp 333
このようなエラーを単にタイプミスと呼びます。 ポインターを交換するのを忘れました。 その結果、行が空であるかどうかのチェックは実行されません。 コードは次のようになっているはずです。
if (*m_szPassword != '\0')
しかし、一方で、これは本当の脆弱性です。 この脆弱性が悪用される可能性があるかどうか、およびそれがどれほど危険であるかという問題は無視します。 主なものは、タイプミスチェックが本当のセキュリティホールを明らかにすることができるということです。 プログラムが空のパスワードで作業を開始した場合、何がうまくいかないかは決してわかりません。
または、PostgreSQLの別の例:
char * px_crypt_md5(const char *pw, const char *salt, char *passwd, unsigned dstlen) { .... unsigned char final[MD5_SIZE]; .... memset(final, 0, sizeof final); .... }
V597コンパイラーは、「最終」バッファーをフラッシュするために使用される「memset」関数呼び出しを削除できました。 RtlSecureZeroMemory()関数を使用して、プライベートデータを消去する必要があります。 pgcrypto crypt-md5.c 157
ここで、PVS-Studioは、関数を終了する前に「最終」配列が無効化されていないことを検出します。 その理由は、診断
V597の説明から
わかります。
PVS-Studioの診断が「脆弱性を十分に明らかにしていない」理由は明らかではありません。
静的コードアナライザーの将来に対するビジョン
一般に、静的解析ではすべてが問題ありません。 この方向のツールは急速に開発されており、非常に人気があります。
ロシアでもこれが早く起こるようにしたい。 静的解析ツールの市場は事実上ありません。 これは、少なくとも当社のサイトへのアクセス数、デモおよび販売統計のダウンロードによって判断できます。 すべての活動の半分はロシアからの訪問者によって作成されます。 しかし、ロシアの顧客の数は50%ではなく、ほんのわずかです。 悲しいです
読者や同僚へのアドレス
「作品に静的解析を使用する」という精神のテキストはささいなものに聞こえます。 したがって、非標準のトピックを取り上げます。
上司と部下の間のコミュニケーションが成功することを願っています。 多くの場合、当局の指示は少なくとも奇妙に見えます。 しかし、上司はプロジェクト全体について多くの知識を持っていることが多いことに留意してください。 そして、高レベルの部下にとって奇妙に思えるものは、非常に有用であるか、単に強制されます。 残念ながら、プログラマー自身がプログラマーであることが多いため、内向的になりがちです。 言い換えれば、タスクを設定するとき、彼らはこれがすべて必要な理由を説明する必要があるとは考えていません。 それらは理解され、赦されなければなりません。 そして、質問をして、そのような奇妙な秩序の原因を理解します。 おそらく、上司は説明を気にしないでしょう。 彼は単純にそれを忘れるか、コミュニケーション時間を「最適化」し、「そのようにする」という複雑なタスクを減らしました。 したがって、私は経営者が彼らのステップと決定を説明することを忘れないことを望みます。
そして、インタビューオーガナイザーに感謝します。
おわりに
読者の皆さん、おまけにボーナス資料が表示されたと言えるでしょう。 著者はあなたが興味を持っていたことを望んでいます。 これで、休暇を取らせてください。 高品質のコードを記述し、最も有用なツールを幅広く使用してください。 最高! さよならを言わないでください。