首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当UBSAN (-fsanitize=undefined)发现未定义的行为时触发测试失败

当UBSAN (-fsanitize=undefined)发现未定义的行为时触发测试失败
EN

Stack Overflow用户
提问于 2021-05-12 09:31:43
回答 2查看 488关注 0票数 5

我这里有一个小单元测试,它有未定义的行为。

源代码:

代码语言:javascript
复制
#include <gtest/gtest.h>

TEST(test, test)
{
    int k = 0x7fffffff;
    k += 1; // cause integer overflow
}

GTEST_API_ int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

我在我的CMakeLists.txt中启用了UBSAN:

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.12)
project(ub CXX)

find_package(GTest REQUIRED)

add_executable        (ub_test ub_test.cpp)
target_link_libraries (ub_test GTest::GTest)
target_compile_options(ub_test PRIVATE -fsanitize=undefined)
target_link_options   (ub_test PRIVATE -fsanitize=undefined)

UBSAN正确地识别了未定义的行为:

/home/steve/src/ub/ub_test.cpp:6:7:运行时错误:有符号整数溢出: 2147483647 +1不能用'int‘表示

不过,我的考试还是通过了。

==========从一个测试套件运行一个测试。全球测试环境的设置。-测试运行test.test /home/steve/src/ub/ub_test.cpp:6:7:运行时错误: 2147483647 +1不能用'int‘OK test.test (0 ms)类型表示-从测试(0 ms总计)到(0 ms总计)通过1次测试。

当UBSAN发现问题时,是否有可能触发测试失败(抛出异常、退出1等)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-12 09:38:27

根据文档

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

请注意,trap / recover选项不启用相应的消毒液,通常需要有一个合适的-fsanitize=标志。

似乎当您使用-fsanitize=时,您正在谈论的事情发生了完全相同的情况。它注意到未定义的行为并报告它,但继续执行。因此,附加一个-fno-sanitize-recover=all应该退出程序。

票数 3
EN

Stack Overflow用户

发布于 2021-12-02 07:12:02

您可以尝试UBSAN_OPTIONS="halt_on_error=1"环境变量。

代码语言:javascript
复制
UBSAN_OPTIONS="halt_on_error=1" cmake --build cmake-build-UBSAN --target test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67500933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档