为何GCC的-Wnull-dereference标志无法检测到我的空指针解引用?
为何GCC的-Wnull-dereference标志无法检测到我的空指针解引用?
这个问题我之前排查过,核心原因其实和GCC的分析机制有关,咱们一步步说清楚:
首先你得知道,-Wnull-dereference这个警告并不是在任何编译级别下都能工作的——它依赖GCC在优化阶段做的数据流分析。默认情况下,GCC用的是-O0(无优化)模式,这个模式下编译器只是快速把代码转换成机器码,不会花功夫去追踪变量的取值路径,自然就不会关联到void_ptr = NULL和后面的*void_ptr这两步操作的潜在风险。
那怎么让它生效呢?很简单,给编译命令加上优化选项,比如-O1、-O2或者-Os都行。比如你改成这样编译:
gcc void_p_test.c -o void_p_test -Wnull-dereference -O1
再运行的话,GCC就会进行深度的静态分析,明确发现你把void_ptr初始化为NULL后直接解引用,这时就会弹出对应的警告了。
顺带提一句,你代码里的void_ptr是int*类型,不是void*,不过这个命名不影响警告的触发,只是个小细节~
内容来源于stack exchange
相关产品推荐
相关产品推荐

