BT

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

| 作者: Abel Avram フォローする 9 人のフォロワー , 翻訳者 編集部N フォローする 0 人のフォロワー 投稿日 2012年12月20日. 推定読書時間: 2 分 |

原文(投稿日: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は、様々な言語用の多くのそのようなツールを載せたページをホストしている。

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT