为什么会出现这个警告?如果我检查边界,这并不是一个真正的假设。以及如何修复?
如果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/