Cha*_*l72 11 c++ gcc g++ compiler-warnings
所以,我刚刚完成了一个大型服务器应用程序的艰苦的多小时调试会话.错误最终归结为构造函数中几乎没有明显的错字.基本上,它是这样的:
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 ... */
}
...
};
Run Code Online (Sandbox Code Playgroud)
看到这个bug?好吧,我没有.问题是初始化列表中的一个小错误:m_request(m_request)正在为自己分配一个未初始化的引用.显然,它应该阅读m_request(request).
现在,成员变量m_request是类型T&.那么 - 是否有一些原因编译器没有警告我我在这里使用了一个未初始化的变量?
使用带有-Wall标志的GCC 4.6 ,如果我说:
int x;
x = x;
Run Code Online (Sandbox Code Playgroud)
......它会发出警告: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
那么,当我分配m_request给自己时,编译器为什么不警告我:基本上为自己分配一个未初始化的引用?这本来可以节省我几个小时的烦恼.
Chr*_*tti 11
追踪的恼人的bug.事实证明,你甚至不需要模板来静默地失败.这就行了:
class C {
int a, b;
public:
C(int t, int z) : a(a), b(z) { };
};
Run Code Online (Sandbox Code Playgroud)
Clang警告说-Wuninitialized.
gcc伙计们的好消息:根据gnu的bugzilla,gcc 4.7.0修复了这个问题.
更新
在gcc 4.7.0上,添加-Wself-init以获取此警告(由sbellef验证):
tst.cc:在构造函数'C :: C(int,int)'中:tst.cc:4:9:警告:'C :: a'用自己初始化[-Wuninitialized]