MSVC /fsanitize-address-use-after-return: 在静态测试注册期间,makeTestInvoker 发生堆栈缓冲区溢出
** 描述错误** 当Catch2和一个测试可执行文件都用 MSVC 地址Sanitizer 加上实验性/fsanitize-address-use-after-return旗来编译时,测试二进制在静态测试注册(主(前))时会中止, ASan 在 Catch:: Detail:: unique ptr < TestInvokerAsFunction > 移动构造器中报告堆-缓冲流. 与 /fsanitize = 单独处理(无使用后返回)的相同构件运行正确。 明确而简洁地描述虫子是什么.
** 预期行为** 没有警告。 抓取与地址 Sanitizer 的对接 。
** 复制步骤** repro.cpp: (英语). #包括 < catchs amalgamated.hpp > TEST CASE("最小","[正 [正]") { REQUIRE (1+ 1 ==; 2.
构建(Catch2 v3.1.5.3,并列) + repro,均与旗相接后运行: cl/EHsc -std:c++latest /MDd/Od/utf-8/fsanitize=地址/fno-sanitize-地址-vcasan-lib /fsanitize-地址-后使用-返回/我额外/c额外/捕获 amalgamated.cpp cl/EHsc -std:c++latest /MDd/Od/utf-8/fsanitize=地址/fno-sanitize-address-vcasan-lib /fsanitize-date-address-后使用-返回/我额外重写.cpp catch amalgamaded.obj. .\ repro.exe -- list-tests (中文(简体) )
结果( 有旗帜 ) :
大小为 8 线程 T0 #0接: 细节: unique ptr < TestInvokerAsFunction > :: unique ptr catch amalgamated.hpp:949 #1 接: 细节: make unique < Test InvokerAsFunction, 无效 (& (void)) > catch amalgamated.hpp: 1029 #2 接: make Test Invoker (void ( ())) catch amalgamated.cpp:7700
3 动态初始化器用于“ 自动注册 1 ”
框架有1个对象: [32, 40] “ 临时编译器” HINT: 如果您的程序使用一些自定义的堆放出风机制, 这可能是一个假正值
成果(不设/保密地址-使用-返回后)——列出并正常运行。
** 格式资料:** 操作系统:Windows 11 编译器:MSVC 19.51 / VS 2026 (14.51.36231) catch2: v3.15.3(也通过非附带条件的catch testy.cpp / catch unique ptr.hpp 在devel上转载)
** 其他情况** 我看不出这是Catch2还是Sanitize的问题 首先在这里存档 如果你确定捕捉的动作正确 我会把它移动到微软ASan.
内容来源: catchorg/Catch2