gpt4 book ai didi

c++ - 确定 "unknown evaluation order"

转载 作者:IT老高 更新时间:2023-10-28 21:44:43 26 4
gpt4 key购买 nike

从 1.80 版开始,Cppcheck 告诉我

Expression 'msg[ipos++]=checksum(&msg[1],ipos-1)' depends on order of evaluation of side effects

在这个代码序列中(简化,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 之前或之后递增。这是因为在 = 处没有“sequence point”,只有在完整表达式的末尾(;)。

函数调用是一个序列点。但这只能保证 ipos-1 在函数调用之前发生。它不保证 ipos++ 发生在之后。

看来代码应该这样重写:

msg[ipos] = checksum(&msg[1], ipos-1);
ipos++; // or ++ipos

关于c++ - 确定 "unknown evaluation order",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45937876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com