本文介绍了假设 if 语句中没有发生有符号溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么会出现此警告?如果我检查界限,这并不是一个真正的假设.以及如何解决?

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

谢谢

错误:假设 (X - c) <= X 始终为真 [-Werror=strict-overflow]cc1plus:所有警告都被视为错误

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

const QList&action_list = tool_menu->actions();静态常量 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),行动);}

它开始于

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

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

tool_menu->insertAction(action_list.at(action_list.count() - 2),行动);
解决方案

从此GCC 资源:

-Wstrict-溢出

-Wstrict-overflow=n

此选项仅在 -fstrict-overflow 处于活动状态时才处于活动状态.它警告编译器基于不发生带符号溢出的假设进行优化的情况.请注意,它不会警告代码可能溢出的所有情况:它只警告编译器实现某些优化的情况.因此,此警告取决于优化级别.

如果所涉及的变量的值使得溢出实际上永远不会发生,则假设不会发生有符号溢出的优化是完全安全的.因此,此警告很容易给出误报:关于实际上不是问题的代码的警告.为了帮助关注重要问题,定义了几个警告级别.在估计循环需要多少次迭代时,特别是在确定是否要执行循环时,不会针对使用未定义的有符号溢出发出警告.

-Wstrict-overflow=1

对可疑且易于避免的情况发出警告.例如,使用 -fstrict-overflow,编译器将 x + 1 > x 简化为 1. -Wstrict-overflow 的这一级别由 -Wall 启用;更高级别不是,必须明确要求.

-Wstrict-overflow=2

还警告其他将比较简化为常数的情况.例如:abs (x) >= 0.这只能在 -fstrict-overflow 生效时进行简化,因为 abs (INT_MIN) 溢出到小于零的 INT_MIN.-Wstrict-overflow(无级别)与 -Wstrict-overflow=2 相同.

-Wstrict-overflow=3

还警告其他简化比较的情况.例如:x + 1 > 1 简化为 x > 0.

-Wstrict-overflow=4

还警告上述案例未涵盖的其他简化.例如:(x * 10)/5 简化为 x * 2.

-Wstrict-overflow=5

还警告编译器会减少比较中涉及的常量大小的情况.例如:x + 2 > y 简化为 x + 1 >= y.这仅在最高警告级别报告,因为这种简化适用于许多比较,因此此警告级别会产生大量误报.

Why is this warning appearing? It's not really an assumption if I check the bounds. And how to fix?

If num_actions_to_skip is set to 1, instead of 2, the error goes away.

Thanks

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

On 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);
}

It started with

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

at qlist.h:454, which performs the same check, and throws this error as well, with just

tool_menu->insertAction(action_list.at(action_list.count() - 2),
                                action);
解决方案

From this GCC resource:


这篇关于假设 if 语句中没有发生有符号溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 07:11