在编译时检测分段错误

mk.*_*k.. 1 c gcc segmentation-fault

我可以在编译时检测到可能的分段错误吗?

我理解分段错误的情况.但我很好奇GCC作为编译器是否有一些标志来检查导致分段错误的基本场景.

这有助于在发布库之前采取预防措施.

Jam*_*lgh 6

我可以在编译时检测到可能的分段错误吗?

有时,但不是,你无法在编译时完美地检测这些场景.考虑这个C代码中的一般情况:

volatile extern int mem[];
void foo (int access)
  {
    mem[access];
  }
Run Code Online (Sandbox Code Playgroud)

如果编译器在编译时警告这种访问,编译器会过于嘈杂,代码是有效的C,并且警告通常是不合适的.除非您具有完整程序或链接时分析机制,否则静态分析无法对此代码执行任何操作.

GCC 4.8中的附加优化标志有时会在循环中捕获一些越界访问,这是"-faggressive-loop-optimizations".这在去年的SPEC基准测试套件中发现了许多问题(http://blog.regehr.org/archives/918)

我理解分段错误的情况.但我很好奇GCC作为编译器是否有一些标志来检查导致段错误的基本场景.

GCC 4.8附带一个地址清理程序,它可以帮助捕获一些运行时唯一的问题(超出范围/使用后免费错误).你可以用它 -fsanitize=address.

http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Debugging-Options.html#Debugging-Options

GCC 4.9(将在未来几个月内发布)附带一个未定义的行为清理程序和更积极的NULL指针路径优化,这可能会帮助您捕获更多问题.当它到来时,它将随时可用-fsanitize=undefined

http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

但请注意,这些都不是"编译时"解决方案,它们都依赖于检测二进制文件并执行运行时检查.

  • @ali Pedantry总是很感激,我已经改进了我的答案,明确了为什么依赖编译时警告是愚蠢的,并明确我回答的问题的哪一部分. (3认同)