从版本 1.80 开始,Cppcheck 告诉我
表达式 'msg[ipos++]=checksum(&msg[1],ipos-1)' 取决于副作用的评估顺序
在此代码序列中(简化,data
是一个变量)
BYTE msg[MAX_MSG_SIZE]; // msg can be smaller, depending on data encoded
int ipos = 0;
msg[ipos++] = MSG_START;
ipos += encode(&msg[ipos], data);
msg[ipos++] = checksum(&msg[1], ipos-1); // <---- Undefined Behaviour?
msg[ipos++] = MSG_END; // increment ipos to the actual size of msg
并将其视为错误,而不是可移植性问题。
它是 C 代码(合并到 C++ 主导的项目中),使用 C++98 兼容编译器编译,同时按预期运行数十年。 Cppcheck 使用 C++03、C89、自动检测语言运行。
我承认代码最好重写一下。但在这样做之前,我尝试弄清楚:它真的取决于评估顺序吗?据我了解,首先评估正确的操作数(需要在调用之前进行),然后进行赋值(以msg[ipos]
)随着增量ipos
最后完成。
我的这个假设是错误的,还是只是误报?
这段代码确实以一种没有明确定义的方式依赖于评估顺序:
msg[ipos++] = checksum(&msg[1], ipos-1);
具体是否有明确规定ipos++
将在之前或之后增加ipos-1
被评估。这是因为没有“序列点 https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points” 在=
,仅在完整表达式的末尾(;
).
函数调用是一个序列点。但这只能保证ipos-1
发生在函数调用之前。它不能保证ipos++
发生在之后。
看来代码应该这样重写:
msg[ipos] = checksum(&msg[1], ipos-1);
ipos++; // or ++ipos
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)