gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:11:06 29 4
gpt4 key购买 nike

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

如果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/

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