为什么gcc编译的程序不会在Debug构建中解除引用未初始化的指针?

时间:2016-10-08 18:05:29

标签: c++ gcc access-violation

来自Visual Studio / MSVC,我预计访问未初始化的指针至少会导致Debug版本的访问冲突/段错误。

这是因为Visual Studio使用0xcdcdcdcd之类的幻数填充所有未初始化的内存,并保护0xcdcdcdcd,因此尝试从中读取/写入会产生访问冲突。

但令我惊讶的是,Linux上的GCC没有这样的事情,因此访问未初始化的指针会导致内存损坏,即使在Debug版本中也是如此,这可能非常难以调试。

使用GCC编译时,此测试代码将很乐意访问我的测试应用程序中的内存位置:

int *p;
int n = *p;

我使用Qt Creator作为我的IDE,我正在编译Debug版本:

gcc -c -pipe -g -Wall -W -fPIE  -I../untitled19 -I. -I/opt/Qt/5.4/gcc/mkspecs/linux-g++ -o main.o ../untitled19/main.c
g++ -Wl,-rpath,/opt/Qt/5.4/gcc -o untitled19 main.o

为什么默认情况下GCC缺少这样一个重要的功能,希望是否有一个能够启用它的编译器标志?

我找到了Magic numbers when debugging with gcc/g++/gdb/valgrind?,但是那里的答案非常令人不满意,基本上建议您编写自己的新/删除实现,这些实现甚至不包括作为局部变量的未初始化指针

0 个答案:

没有答案