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