それで、大規模なサーバー アプリケーションの数時間に及ぶ過酷なデバッグ セッションをやり遂げました。エラーは最終的に、コンストラクターのほとんど目立たないタイプミスにまで至りました。基本的には、次のようなものでした。
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
バグが見えますか?まあ、私はしませんでした。問題は、イニシャライザ リストの小さなタイプミスですm_request(m_request)
。初期化されていない参照を自分自身に割り当てています。明らかに、それは読むことになっていますm_request(request)
。
これで、メンバー変数m_request
の型はT&
. それで、ここで初期化されていない変数を使用していることをコンパイラが警告しなかった理由はありますか?
-Wall
私が言うなら、フラグでGCC 4.6を使用します:
int x;
x = x;
...警告が表示されます:warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
m_request
では、それ自体に代入したときにコンパイラが警告を出さなかったのはなぜでしょうか。それは私を何時間も煩わしくさせなかったでしょう。