mk.*_*k.. 1 c gcc segmentation-fault
我可以在编译时检测到可能的分段错误吗?
我理解分段错误的情况.但我很好奇GCC作为编译器是否有一些标志来检查导致分段错误的基本场景.
这有助于在发布库之前采取预防措施.
我可以在编译时检测到可能的分段错误吗?
有时,但不是,你无法在编译时完美地检测这些场景.考虑这个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
但请注意,这些都不是"编译时"解决方案,它们都依赖于检测二进制文件并执行运行时检查.
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |