diff --git a/CMakePresets.json b/CMakePresets.json index 6d82d4c..4ba87ac 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -85,6 +85,20 @@ "BUILD_WITH_SANITIZERS": true } }, + { + "name": "macos-arm64-san-no-exceptions", + "inherits": "macos-arm64-san", + "cacheVariables": { + "BUILD_WITH_NO_EXCEPTIONS": true + } + }, + { + "name": "macos-arm64-san-no-rtti", + "inherits": "macos-arm64-san", + "cacheVariables": { + "BUILD_WITH_NO_RTTI": true + } + }, { "name": "macos-x64", "inherits": "macos-base", @@ -100,6 +114,20 @@ "BUILD_WITH_SANITIZERS": true } }, + { + "name": "macos-x64-san-no-exceptions", + "inherits": "macos-x64-san", + "cacheVariables": { + "BUILD_WITH_NO_EXCEPTIONS": true + } + }, + { + "name": "macos-x64-san-no-rtti", + "inherits": "macos-x64-san", + "cacheVariables": { + "BUILD_WITH_NO_RTTI": true + } + }, { "name": "windows-base", "hidden": true, @@ -218,20 +246,40 @@ "configurePreset": "linux-gcc-12" }, { - "name": "macos-arm64-debug", + "name": "macos-arm64-debug-san", "configuration": "Debug", "configurePreset": "macos-arm64-san" }, + { + "name": "macos-arm64-debug-san-no-exceptions", + "configuration": "Debug", + "configurePreset": "macos-arm64-san-no-exceptions" + }, + { + "name": "macos-arm64-debug-san-no-rtti", + "configuration": "Debug", + "configurePreset": "macos-arm64-san-no-rtti" + }, { "name": "macos-arm64-release", "configuration": "Release", "configurePreset": "macos-arm64" }, { - "name": "macos-x64-debug", + "name": "macos-x64-debug-san", "configuration": "Debug", "configurePreset": "macos-x64-san" }, + { + "name": "macos-x64-debug-san-no-exceptions", + "configuration": "Debug", + "configurePreset": "macos-x64-san-no-exceptions" + }, + { + "name": "macos-x64-debug-san-no-rtti", + "configuration": "Debug", + "configurePreset": "macos-x64-san-no-rtti" + }, { "name": "macos-x64-release", "configuration": "Release", diff --git a/develop/CMakeLists.txt b/develop/CMakeLists.txt index a2d4144..af2e74f 100644 --- a/develop/CMakeLists.txt +++ b/develop/CMakeLists.txt @@ -1,11 +1,15 @@ option(BUILD_WITH_COVERAGE "Build with coverage" OFF) option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) +option(BUILD_WITH_NO_EXCEPTIONS "Build with no exceptions" OFF) +option(BUILD_WITH_NO_RTTI "Build with no RTTI" OFF) enable_testing() set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(DisableExceptions) +include(DisableRTTI) include(EnableASan) include(EnableGCov) include(EnableUBSan) diff --git a/develop/cmake/DisableExceptions.cmake b/develop/cmake/DisableExceptions.cmake new file mode 100644 index 0000000..a61354a --- /dev/null +++ b/develop/cmake/DisableExceptions.cmake @@ -0,0 +1,5 @@ +add_library(${PROJECT_NAME}.disable_exceptions INTERFACE) +add_library(${PROJECT_NAME}::disable_exceptions ALIAS ${PROJECT_NAME}.disable_exceptions) + +target_compile_options(${PROJECT_NAME}.disable_exceptions INTERFACE + -fno-exceptions) diff --git a/develop/cmake/DisableRTTI.cmake b/develop/cmake/DisableRTTI.cmake new file mode 100644 index 0000000..1bdcecf --- /dev/null +++ b/develop/cmake/DisableRTTI.cmake @@ -0,0 +1,5 @@ +add_library(${PROJECT_NAME}.disable_rtti INTERFACE) +add_library(${PROJECT_NAME}::disable_rtti ALIAS ${PROJECT_NAME}.disable_rtti) + +target_compile_options(${PROJECT_NAME}.disable_rtti INTERFACE + -fno-rtti) diff --git a/develop/cmake/SetupTargets.cmake b/develop/cmake/SetupTargets.cmake index 669463f..eb077d1 100644 --- a/develop/cmake/SetupTargets.cmake +++ b/develop/cmake/SetupTargets.cmake @@ -31,3 +31,16 @@ if(BUILD_WITH_SANITIZERS) meta.hpp::enable_asan meta.hpp::enable_ubsan) endif() + +if(BUILD_WITH_NO_EXCEPTIONS) + target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE + meta.hpp::disable_exceptions) + + target_compile_definitions(${PROJECT_NAME}.setup_targets INTERFACE + DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS) +endif() + +if(BUILD_WITH_NO_RTTI) + target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE + meta.hpp::disable_rtti) +endif() diff --git a/develop/untests/meta_base/fixed_function_tests.cpp b/develop/untests/meta_base/fixed_function_tests.cpp index 057a088..073aa25 100644 --- a/develop/untests/meta_base/fixed_function_tests.cpp +++ b/develop/untests/meta_base/fixed_function_tests.cpp @@ -122,6 +122,6 @@ TEST_CASE("meta/meta_base/fixed_function") { s = std::make_unique(10) ](){}; fixed_function ff = std::move(f); - CHECK_NOTHROW(ff()); + ff(); } } diff --git a/develop/untests/meta_features/diamond_tests.cpp b/develop/untests/meta_features/diamond_tests.cpp index 511f8f4..8c1f525 100644 --- a/develop/untests/meta_features/diamond_tests.cpp +++ b/develop/untests/meta_features/diamond_tests.cpp @@ -330,9 +330,11 @@ TEST_CASE("meta/meta_features/diamond") { CHECK(meta::resolve_type(cd) == meta::resolve_type()); CHECK(meta::resolve_type(dd) == meta::resolve_type()); + #if !defined(META_HPP_NO_RTTI) CHECK(meta::resolve_polymorphic_type(ad) == meta::resolve_type()); CHECK(meta::resolve_polymorphic_type(bd) == meta::resolve_type()); CHECK(meta::resolve_polymorphic_type(cd) == meta::resolve_type()); CHECK(meta::resolve_polymorphic_type(dd) == meta::resolve_type()); + #endif } } diff --git a/develop/untests/meta_states/member_tests.cpp b/develop/untests/meta_states/member_tests.cpp index 932b3c7..7c38a2a 100644 --- a/develop/untests/meta_states/member_tests.cpp +++ b/develop/untests/meta_states/member_tests.cpp @@ -136,20 +136,20 @@ TEST_CASE("meta/meta_states/member") { } { - CHECK_NOTHROW(vm.set(v, 10)); CHECK(vm.get(v) == 10); - CHECK_NOTHROW(vm.set(&v, 100)); CHECK(vm.get(v) == 100); + vm.set(v, 10); CHECK(vm.get(v) == 10); + vm.set(&v, 100); CHECK(vm.get(v) == 100); CHECK_THROWS(vm.set(std::as_const(v), 11)); CHECK(vm.get(v) == 100); CHECK_THROWS(vm.set(&std::as_const(v), 11)); CHECK(vm.get(v) == 100); - CHECK_NOTHROW(vm.set(std::move(v), 12)); CHECK(vm.get(v) == 12); + vm.set(std::move(v), 12); CHECK(vm.get(v) == 12); CHECK_THROWS(vm.set(std::move(std::as_const(v)), 13)); CHECK(vm.get(v) == 12); - CHECK_NOTHROW(vm(v, 13)); CHECK(vm(v) == 13); - CHECK_NOTHROW(vm(&v, 130)); CHECK(vm(v) == 130); + vm(v, 13); CHECK(vm(v) == 13); + vm(&v, 130); CHECK(vm(v) == 130); CHECK_THROWS(vm(std::as_const(v), 14)); CHECK(vm(v) == 130); CHECK_THROWS(vm(std::as_const(v), 14)); CHECK(vm(v) == 130); - CHECK_NOTHROW(vm(std::move(v), 15)); CHECK(vm(v) == 15); + vm(std::move(v), 15); CHECK(vm(v) == 15); CHECK_THROWS(vm(std::move(std::as_const(v)), 16)); CHECK(vm(v) == 15); CHECK_THROWS(vm.set(v2, 17)); diff --git a/develop/untests/meta_states/variable_tests.cpp b/develop/untests/meta_states/variable_tests.cpp index e4ab200..25a3e3d 100644 --- a/develop/untests/meta_states/variable_tests.cpp +++ b/develop/untests/meta_states/variable_tests.cpp @@ -84,8 +84,8 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - CHECK_NOTHROW(vm.set(10)); CHECK(vm.get() == 10); - CHECK_NOTHROW(vm(11)); CHECK(vm() == 11); + vm.set(10); CHECK(vm.get() == 10); + vm(11); CHECK(vm() == 11); } SUBCASE("const int") { @@ -132,8 +132,8 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - CHECK_NOTHROW(vm.set(20)); CHECK(vm.get() == 20); - CHECK_NOTHROW(vm(21)); CHECK(vm() == 21); + vm.set(20); CHECK(vm.get() == 20); + vm(21); CHECK(vm() == 21); } SUBCASE("const ref int") { @@ -169,7 +169,7 @@ TEST_CASE("meta/meta_states/variable") { { auto nv = std::make_unique(11); - CHECK_NOTHROW(vm.set(std::move(nv))); + vm.set(std::move(nv)); CHECK(*clazz_1::unique_int_variable == 11); } @@ -190,7 +190,7 @@ TEST_CASE("meta/meta_states/variable") { { auto nv = std::make_unique(13); - CHECK_NOTHROW(vm.set(std::move(nv))); + vm.set(std::move(nv)); CHECK(*clazz_1::unique_int_variable == 13); } diff --git a/develop/untests/meta_types/method_type_tests.cpp b/develop/untests/meta_types/method_type_tests.cpp index c80a014..7fcb7ee 100644 --- a/develop/untests/meta_types/method_type_tests.cpp +++ b/develop/untests/meta_types/method_type_tests.cpp @@ -16,7 +16,7 @@ namespace switch ( i ) { case 0: return x; case 1: return y; - default: throw std::out_of_range("ivec2::at"); + default: std::abort(); } } diff --git a/develop/untests/meta_utilities/arg5_tests.cpp b/develop/untests/meta_utilities/arg5_tests.cpp index 4502d82..63f2e3b 100644 --- a/develop/untests/meta_utilities/arg5_tests.cpp +++ b/develop/untests/meta_utilities/arg5_tests.cpp @@ -143,10 +143,10 @@ TEST_CASE("meta/meta_utilities/arg5/cast") { static_assert(std::is_invocable_v); static_assert(std::is_invocable_v); - CHECK_NOTHROW([](A*){}(LV())); - CHECK_NOTHROW([](const A*){}(LV())); - CHECK_NOTHROW([](A* const){}(LV())); - CHECK_NOTHROW([](const A* const){}(LV())); + [](A*){}(LV()); + [](const A*){}(LV()); + [](A* const){}(LV()); + [](const A* const){}(LV()); CHECK(uarg(LV()).cast() == static_cast(src)); CHECK(uarg(LV()).cast() == static_cast(src)); diff --git a/develop/untests/meta_utilities/arg_tests.cpp b/develop/untests/meta_utilities/arg_tests.cpp index 378affe..d681479 100644 --- a/develop/untests/meta_utilities/arg_tests.cpp +++ b/develop/untests/meta_utilities/arg_tests.cpp @@ -75,7 +75,7 @@ namespace if ( std::is_invocable_v ) {\ CHECK(uarg{FromValue}.can_cast_to());\ CHECK(uarg_base{type_list{}}.can_cast_to());\ - CHECK_NOTHROW(std::ignore = uarg{FromValue}.cast());\ + std::ignore = uarg{FromValue}.cast();\ \ CHECK(f_state.is_invocable_with());\ CHECK(f_state.invoke(FromValue) == 1);\ diff --git a/develop/untests/meta_utilities/inst_tests.cpp b/develop/untests/meta_utilities/inst_tests.cpp index 7033bca..d05b361 100644 --- a/develop/untests/meta_utilities/inst_tests.cpp +++ b/develop/untests/meta_utilities/inst_tests.cpp @@ -35,7 +35,7 @@ namespace if ( std::is_invocable_v ) {\ CHECK(uinst{Inst}.can_cast_to());\ CHECK(uinst_base{type_list{}}.can_cast_to());\ - CHECK_NOTHROW(std::ignore = uinst{Inst}.cast());\ + std::ignore = uinst{Inst}.cast();\ \ CHECK(m_state.is_invocable_with());\ CHECK(m_state.invoke(Inst) == 1);\ diff --git a/develop/untests/meta_utilities/value_tests.cpp b/develop/untests/meta_utilities/value_tests.cpp index 77e6ec8..f31b41e 100644 --- a/develop/untests/meta_utilities/value_tests.cpp +++ b/develop/untests/meta_utilities/value_tests.cpp @@ -379,7 +379,7 @@ TEST_CASE("meta/meta_utilities/value") { SUBCASE("ostream") { std::stringstream str_stream; - CHECK_NOTHROW(str_stream << meta::uvalue{21} << " " << meta::uvalue{42}); + str_stream << meta::uvalue{21} << " " << meta::uvalue{42}; CHECK_THROWS((str_stream << meta::uvalue{ivec2{1,2}})); REQUIRE(str_stream.str() == "21 42"); } @@ -391,9 +391,9 @@ TEST_CASE("meta/meta_utilities/value") { CHECK_THROWS(str_stream >> v); v = meta::uvalue{0}; - CHECK_NOTHROW(str_stream >> v); + str_stream >> v; CHECK(v == 21); - CHECK_NOTHROW(str_stream >> v); + str_stream >> v; CHECK(v == 42); } @@ -436,10 +436,10 @@ TEST_CASE("meta/meta_utilities/value") { { int i{42}; - void* p1 = &i; - const void* p2 = &i; - void* const& p3 = &i; - const void* const& p4 = &i; + [[maybe_unused]] void* p1 = &i; + [[maybe_unused]] const void* p2 = &i; + [[maybe_unused]] void* const& p3 = &i; + [[maybe_unused]] const void* const& p4 = &i; CHECK_THROWS(std::ignore = *meta::uvalue(p1)); CHECK_THROWS(std::ignore = *meta::uvalue(p2));