确定“未知的评估顺序”

2024-03-12

从版本 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(使用前将#替换为@)

确定“未知的评估顺序” 的相关文章

随机推荐

  • 从字符串中删除每个第 n 个元素

    如何删除字符串中的每第 n 个元素 我猜你会使用drop以某种方式发挥作用 就像这样删除第一个 n 你怎么能改变它 只删除第 n 个 然后是后面的第 n 个 依此类推 而不是全部 dropthem n xs drop n xs 简单的 取
  • 脚本在 上时不起作用

    我证明了剧本 它的作品 但在 我不擅长剧本 也许这是一个简单的问题 基本上 脚本只是显示 当鼠标悬停在图像上时 img1 mouseover functi
  • 字节顺序、“最高有效”和“最低有效”

    我在网上阅读了描述大端和小端的描述 然而 它们似乎基本上都以相同的方式读取 我仍然对 最多 和 最少 有效字节的实际实现感到困惑 据我了解 小端值首先评估 最低有效 值 而在大端值下 首先评估 最高有效 字节 但是 我不清楚 最 和 最不
  • 为什么类不能用作模块?

    Module是的超类Class Class superclass gt Module 在面向对象编程中 这意味着Class可以在任何有实例的地方使用Module可以使用 令人惊讶的是 情况并非如此ClassRuby 中的实例 class C
  • 使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval

    我正在寻找一个很好的解决方案来通过字符串值访问属性 但如果该属性不存在 则应该创建它 如果根结构已经定义了该结构的某些部分 则不应覆盖这些属性 而应合并这些属性 例如 如果您有一个空对象test并且您想在不使用 eval 的情况下设置深层结
  • 如何用
    $...$
    替换 LaTeX $...$ 和 $$...$$ 符号?

    我目前遇到的问题是 Jekyll 不能很好地与 Markdown 和 LaTeX 配合使用 所以我有很多文章 frac some latex or int e v en more 我该如何更换 by span span and by div
  • 匹配 ggplot2 中的图例项和颜色,其中某些 geom_segment 未包含在图例中

    我似乎无法让我的图例标签和颜色在 ggplot2 中正确匹配 我有一些 geom segments 我不想包含在图例中 我尝试了各种选择 但没有一个有效 现有的问题似乎都没有涉及未在绘图上标记某些元素的问题 所以这可能会增加复杂性 代码如下
  • 具有来自同一个表的 2 个外键的 Django 模型

    我想要一个带有来自同一个表的 2 个外键的 Django 模型 这是一个事件表 有两列员工 参与者 和 接收者 但我收到这个错误 错误 一个或多个模型未验证 tasks task 中介 模型 TaskEvent 有多个 Employee 外
  • Tcl.h:没有这样的文件或目录

    我正在尝试将一些代码从 Solaris 机器移植到 Linux 特别是 Redhat 机器上 代码编译没有问题 并且在 Solaris 机器上运行也没有问题 然而 在 Linux 上重新编译时 我遇到了 tcl h 的问题 编译器告诉我 e
  • JCL TEvaluator 类中预定义了哪些函数

    有谁知道其中包含哪些预定义功能 例如 ABS 功能 TEvaluatorDelphi 7 的 JCL 类 没有任何标准功能Math pas包括 默认评估解析器中实现的所有内容都是运算符or xor and not mod lt gt lt
  • 使用 python 3 抓取需要登录的网站

    只是一个关于一些抓取身份验证的问题 使用BeautifulSoup importing the requests lib import requests from bs4 import BeautifulSoup specifying th
  • 如何通过CSS将鼠标悬停在导航菜单上来隐藏和显示Bootstrap 4卡片?

    您好 我试图通过将鼠标悬停在菜单列表上来显示和隐藏卡片的特定部分 我可以使用 css 隐藏卡片 但无法通过特定类的 css 的 display block 属性来显示它 HTML 导航菜单 div class d flex justify
  • ctags 和 Fortran 的接口

    我想知道如何让 ctags 使用 Fortran 中的接口 例如 INTERFACE SOME ROUTINE MODULE SOME ROUTINE A MODULE SOME ROUTINE B END SOME ROUTINE 因此
  • 将数据从钩子传递到 codeigniter 中的视图

    我可以将数据从钩子传递到视图吗 如果可能 请解释一下 例如 hook post controller constructor array class gt Varify user function gt user project filen
  • NUnit Assert.Equals 我错过了什么?

    Assert Equals 从不调用 Equals operator operator 我错过了什么吗 我已经实现了 IEquatable 但在使用 nunit 时仍然从未调用这些方法 if objectA objectB Assert F
  • 为什么 C++17 结构化绑定不使用 { }?

    我找到了 C 结构化绑定的原始提案here http www open std org jtc1 sc22 wg21 docs papers 2015 p0144r0 pdf 它提出了一种轻松绑定多个返回值的方法 即 auto a b mi
  • asp .net 验证在 IE 10 中不起作用

    有人遇到过这个问题吗 我需要对一个表单进行字段验证 我已经测试过该表单 并且知道它可以在 IE 7 9 Firefox 和 Chrome 中工作 但在 IE 10 中 它允许在不进行任何验证的情况下提交表单 该网站采用 Net 3 5 我在
  • 更新 mongo 中的字段类型

    我有大量记录collection field value 我怎样才能有效地更新到 字段 值 我尝试过这样的事情 pymongo 语法 collection update field 1 exists True set field field
  • wso2 调用 API 时无需令牌

    我正在使用 WSO2 API Mananger 管理我的 API 到目前为止 每个 API 都是私有的 并且可以使用访问令牌进行访问 新用例中的一些 API 是完全公开的 任何人都可以匿名访问它们 只需 GET POST PUT 即可 无需
  • 确定“未知的评估顺序”

    从版本 1 80 开始 Cppcheck 告诉我 表达式 msg ipos checksum msg 1 ipos 1 取决于副作用的评估顺序 在此代码序列中 简化 data是一个变量 BYTE msg MAX MSG SIZE msg c