clang-diagnostic-for-loop-analysis误报?const引用循环变量合法性确认
关于Clang静态分析工具误报循环变量未修改的问题
我编写了如下代码:
void splay(const size_t x) { for (const size_t& nxfa = nodes.at(x).father; nxfa;) { normalize(nxfa); const Node& nf = nodes.at(nxfa); if (nf.lch) normalize(nf.lch); if (nf.rch) normalize(nf.rch); rotate(x == nf.lch ? 'R' : 'L', x); } }
Clang的clang-diagnostic-for-loop-analysis工具提示:"variable 'nxfa' used in loop condition not modified in loop body."
但内联函数调用rotate会修改nxfa所引用的对象,只是未通过该const引用进行修改。请问这属于合法用法,仅为工具误报吗?
解答
这属于合法的C++用法,确实是Clang静态分析工具的误报。
静态分析工具的数据流分析逻辑较为基础,它仅能追踪到nxfa是一个const引用,循环体内没有直接修改该引用本身,但无法识别到rotate函数内部会间接修改nodes.at(x).father(即nxfa引用的原始对象)。这种间接修改的场景超出了该诊断工具的检查范围,因此产生了误报。
规避方案
可以改用while循环绕过该误报,代码如下:
void splay(const size_t x) { while (nodes.at(x).father) { const size_t nxfa = nodes.at(x).father; normalize(nxfa); const Node& nf = nodes.at(nxfa); if (nf.lch) normalize(nf.lch); if (nf.rch) normalize(nf.rch); rotate(x == nf.lch ? 'R' : 'L', x); } }
内容的提问来源于stack exchange,提问作者JS0
相关产品推荐
相关产品推荐

