c++ - 假设 if 语句中没有发生有符号溢出

标签 c++ qt g++

为什么会出现这个警告?如果我检查边界,这并不是一个真正的假设。以及如何修复?

如果num_actions_to_skip设置为 1,而不是 2,错误消失。

谢谢

error: assuming signed overflow does not occur when assuming that (X - c) <= X is always true [-Werror=strict-overflow]
cc1plus: all warnings being treated as errors

关于 if (loc >= 0 && loc < action_list.count()) {

const QList<QAction *> &action_list = tool_menu->actions();
static const int num_actions_to_skip = 2;
const int loc = action_list.count() - num_actions_to_skip;
if (loc >= 0 && loc < action_list.count()) {
    tool_menu->insertAction(action_list.at(loc),
                            action);
}

开始于

Q_ASSERT_X(i >= 0 && i < p.size()

在 qlist.h:454,它执行相同的检查,并且也抛出这个错误,只是

tool_menu->insertAction(action_list.at(action_list.count() - 2),
                                action);

最佳答案

你只需要重新考虑你的逻辑。

static const int num_actions_to_skip = 2;
const int loc = action_list.count() - num_actions_to_skip;
if (loc >= 0 && loc < action_list.count()) {
    // ...
}

显然 action_list.count() 是一个常量值(至少它不会随着这段代码的执行而改变),并且编译器能够计算出来。

让我们稍微简化一下,将 num_actions_to_skip 替换为 2,将 action_list.count() 减少为 count .然后我们可以将 loc 重新表示为 count - 2

您的if 条件变为:

if (count - 2 >= 0 && count - 2 < count)

这相当于(假设,正如编译器警告所说,没有发生溢出):

if (count >= 2 && -2 < 0)

后半部分 -2 > 0 显然是真的,所以你可以放心地放弃它,这给我们留下了

if (count >= 2)

重新替换原始项,这给了我们:

static const int num_actions_to_skip = 2;
// const int loc = action_list.count() - num_actions_to_skip;
if (action_list.count() >= num_actions_to_skip) {
    // ...
}

编译器警告您它正在​​执行优化,如果存在整数溢出则可能无效(允许假设没有溢出,因为如果存在则行为未定义)。非常友好地警告您这一点——这对您来说是幸运的,因为它指出了您的代码正在做一些它不需要做的事情这一事实。

不知是否需要保留loc的声明;这取决于您以后是否使用它。但是,如果您按照我建议的方式简化代码,它应该以相同的方式工作,并且更易于阅读和理解。

如果您收到来自编译器的警告消息,您的目标不应该只是让消息消失;应该深入了解编译器警告您的内容,以及您的代码导致该问题的原因。

您比我更了解这段代码的上下文。如果您查看修改后的版本,您可能会发现它更清楚地表达了意图。

关于c++ - 假设 if 语句中没有发生有符号溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521501/

相关文章:

c++ - parent 和二传手

C++ 类的静态成员在构造函数之后初始化

c++ - 使用 FLTK 和 g++ 的 undefined reference

c++ - 如何轻松知道编译器选择了哪些特殊成员函数?

c++ - 读取文件然后创建数组函数 C++

c++ - 在 C++ 中搜索和插入具有 3 个元素的映射

c++ - 为什么 Qt 为其容器类使用有符号整数类型?

c++ - 如何将隐藏的数据发送到pyqt中的QComboBOX

c++ - static_cast 动态_cast : expected constant expression?

c++ - QT5 和 Antlr4.8 不能用 Cmake 和 QT Creator 编译