catchorg / catchorg/Catch2

Using BENCHMARK() on Windows 10 system causes SIGSEGV depending on compiler

Open
#2,998 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
21.5k
Forks
3.5k
Avg merge
3d 16h
Merged PRs (30d)
2

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

int main(int argc,char* argv[])
{
return Catch::Session().run(argc, argv);
}
```

Benchmark.cpp:
```
#include
#include

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 04cbcfa1 (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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.