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