BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース エラーリストが静的コード解析の必要性を裏付け

エラーリストが静的コード解析の必要性を裏付け

原文(投稿日:2012/12/14)へのリンク

 

CとC++向けの静的コード解析ツールであるPVS-Studioを開発している、Program Verification Systemsが Chromium, TortoiseSVN, Apache HTTP Server, MySQLなどの人気のあるオープンソースプロジェクトで見つかった、プログラミングエラーリストの一部を公開した。

リストには、150以上のタイプのコーディングエラー、それらの一部は重大な論理的エラーで、他にはパフォーマンス関連の誤りも含まれているが、一部のものは害がない。

以下のものは、このリストにある実プロジェクトからのコード例を含んだ2,3のエラータイプである。

V502 - 恐らく '?:' オペレータは期待とは違う動きになる。'?:' オペレータは、'foo' オペレータよりも優先度が低い。

MongoDB:

string sysInfo() {
  ....
  stringstream ss;
  ....
  ss << (sizeof(char *) == 8) ? " 64bit" : " 32bit";
  ....
}

非常に良い例。 "32bit"/"64bit"ではなく、0か1がプリントされる。

V511 - 下記の例の場合、sizeof()オペレータは、ポインタのサイズを返し、配列のサイズではない。

Chromium:

uint8 salt_[LINK_SALT_LENGTH];

VisitedLinkMaster::TableBuilder::TableBuilder(
    VisitedLinkMaster* master,
    const uint8 salt[LINK_SALT_LENGTH])
    : master_(master),
      success_(true) {
  fingerprints_.reserve(4096);
  memcpy(salt_, salt, sizeof(salt));
}

'salt'オブジェクトは、単なるポインタである。大括弧中の 値LINK_SALT_LENGTHは、使っているプログラマにとっては、LINK_SALT_LENGTH 項目の配列を意味している。しかし関数に渡されたのは、項目の配列ではなく、単にポインタである。なので、sizeof(salt) 式は、4あるいは8を返す(32ビット/64ビットシステムにおけるポインタのサイズ)。

様々なオープンソースプロジェクトで見られるように、このリストで示された多くのエラーは、今までに修正されている可能性がある。どんなプログラマもエラーを起こしてしまうものなので、ソースコードを1つないし幾つもの静的コード解析ツールに通していみるのは非常に推奨できることである。 Wikipediaは、様々な言語用の多くのそのようなツールを載せたページをホストしている。

 

この記事に星をつける

おすすめ度
スタイル

BT