Skip to content

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

Open
@nkc-nkc

Description

@nkc-nkc

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions