我在这种形式的代码中看到了一个有趣的错误:
#include <iostream>
char * some_function(void)
{
char local_string[] = "Hello, world!";
static char * static_pointer = local_string; // Here is the bug
std::cout << static_pointer << std::endl;
return local_string; // Here is a related bug
}
void function_nest(void)
{
int i = 5;
// std::cout << i << std::endl;
some_function();
}
int main(int argc, char ** argv)
{
some_function();
function_nest();
some_function();
}
第一次调用此函数时,*static_pointer
的值是明确定义的(它是指向“Hello,world!”的指针)。但是在后续调用中,指针没有意义,因为它指向第一次调用的局部变量(可能是在堆栈上)。
如果我使用g++
进行编译,那么它就会给我一个警告,就像我期望的那样:
static-pointer-bug2.cpp:6:10: warning: address of local variable ‘local_string’ returned [enabled by default]
但它没有给static_pointer
初始化local_string
的任何警告。这是一类错误。
当我运行它(Ubuntu 13.04 64位Intel PC)时,我得到:
Hello, world!
�ˤ��
Hello, world!
(我想我第三次幸运。)
是否有任何g++
警告可以启用以捕获此信息?