【问题标题】:Checking for signed overflow by default, but with opt-out默认情况下检查签名溢出,但选择退出
【发布时间】:2018-03-11 20:48:18
【问题描述】:

当使用 clang 和/或 gcc 时,有没有一种方法可以让编译器默认执行有符号整数溢出检查(例如,如果检测到,则中止) - 但同时 选择退出对特定变量或操作的检查?

【问题讨论】:

    标签: c++ gcc clang


    【解决方案1】:

    我可以推荐你KINT。例子:()

    动态检查:

    使用clang++ 编译和链接您的程序与-fsanitize=undefined 标志。确保使用clang++(而不是ld)作为链接器,以便您的可执行文件与正确的UBSan 运行时库链接。如果您正在编译/链接 C 代码,则可以使用 clang 而不是 clang++

    % cat test.cc
    int main(int argc, char **argv) {
      int k = 0x7fffffff;
      k += argc;
      return 0;
    }
    % clang++ -fsanitize=undefined test.cc
    % ./a.out
    test.cc:3:5: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'
    

    为每种检查定义所需的行为:

    • fsanitize=...:打印详细的错误报告并继续执行(默认);
    • fno-sanitize-recover=...:打印详细的错误报告并退出程序;
    • fsanitize-trap=...:执行陷阱指令(不需要 UBSan 运行时支持)。

    详细信息:

    【讨论】:

    • 谢谢,它看起来是个有趣的工具。它依赖于静态分析,这在工作时非常棒(而且这个框架似乎增加了这种机会) - 但在我的情况下,我实际上要求对所有整数数学进行动态检查(例如,add rax, rbx; jo overflow_handler 之类的东西将是为签名添加发出),并且只能选择退出“热路径”检查。
    • @BeeOnRope,添加动态检查有符号整数溢出
    猜你喜欢
    • 2016-04-15
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多