我最近将一个Linux C ++应用程序移植到Windows(通过Visual Studio 2010 C ++ express)。在这个过程中,我注意到Windows可执行文件往往会在我的代码中发现细微的错误,从而导致程序崩溃。但是相同的代码和错误似乎在Linux / GCC中没有引起注意,程序将继续快乐地运行。我在过去尝试移植的程序中看到过这种行为。我的代码中的一个示例错误是将数组传递1个元素。
我可以启用哪些标志来改善GCC中的运行时错误捕获?我希望我的程序在遇到最轻微的运行时错误时与Windows版本一样易变。或者这更多地取决于操作系统并且不受用户控制?
答案 0 :(得分:1)
我的代码中的一个示例错误是将数组传递1个元素。
这样的错误通常很容易被Valgrind检测到。当你怀疑这样的bug时,我建议你在Valgrind下检查你的代码 - 它会在调试过程中节省大量的时间。
答案 1 :(得分:0)
-fstack-protector-all + valgrind可能就是你所需要的。前者有助于精确堆栈损坏:
$ cat 1.c
int main() {
char data[10];
int x;
data[10] = 'x';
return 0;
}
$ gcc 1.c && ./a.out
$ gcc -fstack-protector-all 1.c && ./a.out
Abort trap
后者检查堆问题。