【问题标题】:Compiler warning (or static analysis) for subtraction of unsigned integers?无符号整数减法的编译器警告(或静态分析)?
【发布时间】:2021-09-06 15:29:04
【问题描述】:

考虑以下程序:

#include <iostream>

int main()
{
    unsigned int a = 3;
    unsigned int b = 7;

    std::cout << (a - b) << std::endl;  // underflow here!

    return 0;
}

在以std::cout 开头的行中发生了下溢,因为a 小于b 所以a-b 小于0,但是由于ab 是unsigend 所以a-b .

当我尝试计算两个无符号整数的差时,是否有一个编译器标志(用于 G++)给我一个警告?

现在,有人可能会争辩说,在使用任何运算符的任何计算中都可能发生上溢/下溢。但我认为将运算符 - 应用于 unsigend ints 会更危险,因为对于无符号整数,这个错误可能会发生在非常低​​(对我来说:“更常见”)的数字。

找到此类事情的(静态分析)工具也很棒,但我更喜欢编译器标志和警告。

【问题讨论】:

  • 浏览the GCC docs 并搜索“未签名”等,我预计答案可能是“否”:最相关的标志用于比较或转换。
  • @Jorengarenar 确实很接近。我仍然对“因为这种行为定义明确,编译器触发警告没有意义”感到有些不自在。反例:未使用的变量。它们定义明确,仍然 gcc 可能会警告它们。所以我认为这不适用于这里。
  • @TobiMcNamobi 诊断潜在无符号整数溢出的问题是误报具有明确定义和预期效果的代码,这有助于程序的正确运行。程序员经常误解无符号溢出的工作原理这一事实并没有改变这样一个事实,即行为是明确定义的并且经常被故意利用。未使用的变量对于纠正程序的操作从来都不是必需的(除非存在未定义的行为,在这种情况下,它们的存在是另一个未解决缺陷的副作用)。

标签: c++ g++


【解决方案1】:

GCC 不(afaict)支持它,但 Clang's UBSanitizer 有以下选项 [emphasis mine]:

-fsanitize=unsigned-integer-overflow:无符号整数溢出,无符号整数计算的结果无法以其类型表示。 与有符号整数溢出不同,这不是未定义的行为,但通常是无意的。此清理程序不会检查在此类计算之前执行的有损隐式转换

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2019-03-24
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多