Open
Description
Describe the bug
Calling application that uses BENCHMARK() compiled with current MSVC compiler causes program to fail with SIGSEGV on a Windows 10 system. Using an older compiler works.
Expected behavior
When .exe file is called, the benchmark should complete without aborting.
Reproduction steps
Complete minimum viable example:
main.cpp:
#include <catch2/catch_session.hpp>
int main(int argc,char* argv[])
{
return Catch::Session().run(argc, argv);
}
Benchmark.cpp:
#include <catch2/catch_test_macros.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>
int stub()
{
return 0;
}
TEST_CASE("Main") {
BENCHMARK("main") {
return stub();
};
}
CMakeLists.txt:
cmake_minimum_required (VERSION 3.20)
project ("Benchmark" LANGUAGES CXX)
find_package(Catch2 3 REQUIRED)
include(CTest)
include(Catch)
set(benchmark_src "Benchmark.cpp" "main.cpp")
add_executable(benchmark ${benchmark_src})
target_link_libraries(benchmark PRIVATE Catch2::Catch2)
set_property(TARGET benchmark PROPERTY CXX_STANDARD 20)
catch_discover_tests(benchmark)
Code generation for version with bug, started from Development PowerShell for VS 2022:
cmake -DCMAKE_PREFIX_PATH=[...]\Catch2Release -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build .\build\
Code generation for version without bug, started from clean command prompt:
"[...]\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.29
cmake -DCMAKE_PREFIX_PATH=[...]\Catch2ReleaseOldCompiler -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build .\build\
Output:
-------------------------------------------------------------------------------
Main
-------------------------------------------------------------------------------
[...]\Benchmark.cpp(9)
...............................................................................
benchmark name samples iterations est run time
mean low mean high mean
std dev low std dev high std dev
-------------------------------------------------------------------------------
main 100 45739 0 ns
[...]\Benchmark.cpp(9[...]\Benchmark.cpp[...]\Benchmark.cpp)(: 9()9: )FAILEDFAILED:
:
: due to a fatal error conditiondue to a fatal error condition:FAILED:
:
due to a fatal error condition SIGSEGV - Segmentation violation signal: SIGSEGV - Segmentation violation signal
===============================================================================
SIGSEGV - Segmentation violation signal===============================================================================
------
---test cases-: -
1- | test cases-1----: --2failed---- |
-2assertions---- : -failed---3--
-assertions- | -: ---3 3-- | -failed3-----
failed
--
-
----------------------------
Platform information:
Target system:
- OS: Microsoft Windows 10 Enterprise LTSC, Version 10.0.17763 Build 17763
General build configuration:
- OS: Windows 11 Pro, Version 10.0.22.631 Build 22631
- Catch version: v3.8.1 devel version at commit 04cbcfa (11.06.2025)**
- CMake version: 4.0.3
Build configuration with bug:
- Compiler+version: MSVC 19.44.35211.0 (current version for Visual Studio 2022 as of right now)
Build system configuration without bug:
- Compiler+version: MSVC 19.29.30159.0 (last version for Visual Studio 2019)
Additional context
- I built the Catch2 libraries from the source files with the compiler versions listed above.
- Both versions run on the build system.
- Using other Catch2 features such as REQUIRE() instead of BENCHMARK() does not produce any errors.
Metadata
Metadata
Assignees
Labels
No labels