diff --git a/thirdparty/sanitizers/FindCFI.cmake b/thirdparty/sanitizers/FindCFI.cmake new file mode 100644 index 0000000..fbfa43a --- /dev/null +++ b/thirdparty/sanitizers/FindCFI.cmake @@ -0,0 +1,44 @@ +# The MIT License (MIT) +# +# Copyright (c) +# 2013 Matthew Arsenault 2015-2016 RWTH Aachen University, Federal Republic of Germany +# 2021 Markus Eggenbauer +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +# OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +option(SANITIZE_CFI "Enable Control Flow Integrity (CFI) for sanitized targets." OFF) + +set(FLAG_CANDIDATES + # FIXME: Brief comment on why the additional flags + # In this case you need a + # linker that does optimization at + # linking time such as LLVM lld or GNU gold. + "-g -fsanitize=cfi -fvisibility=hidden -flto -fuse-ld=lld") + +# There might be some conflict with the other sanitizer +# hence it might need an if statement here. + +# add some handy functions +include(sanitize-helpers) + +if(SANITIZE_CFI) + sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "ControlFlowIntegrity" "CFI") +endif() + +function(add_sanitize_cfi TARGET) + sanitizer_check_target(${TARGET}) + sanitizer_add_flags(${TARGET} "ControlFlowIntegrity" "CFI") +endfunction() diff --git a/thirdparty/sanitizers/FindLeakSan.cmake b/thirdparty/sanitizers/FindLeakSan.cmake new file mode 100644 index 0000000..37a9746 --- /dev/null +++ b/thirdparty/sanitizers/FindLeakSan.cmake @@ -0,0 +1,39 @@ +# The MIT License (MIT) +# +# Copyright (c) +# 2013 Matthew Arsenault +# 2015-2016 RWTH Aachen University, Federal Republic of Germany +# 2019 Barcelona Supercomputing Center +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +option(SANITIZE_LEAK "Enable LeakSanitizer for sanitized targets." Off) + +set(FLAG_CANDIDATES "-g -fsanitize=leak") + +include(sanitize-helpers) + +if(SANITIZE_LEAK) + sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "LeakSanitizer" "LeakSan") +endif() + +function(add_sanitize_leak TARGET) + sanitizer_check_target(${TARGET}) + sanitizer_add_flags(${TARGET} "LeakSanitizer" "LeakSan") +endfunction() diff --git a/thirdparty/sanitizers/FindSS.cmake b/thirdparty/sanitizers/FindSS.cmake new file mode 100644 index 0000000..8f777a6 --- /dev/null +++ b/thirdparty/sanitizers/FindSS.cmake @@ -0,0 +1,39 @@ +# The MIT License (MIT) +# +# Copyright (c) +# 2013 Matthew Arsenault 2015-2016 RWTH Aachen University, Federal Republic of Germany +# 2021 Markus Eggenbauer +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +# OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +option(SANITIZE_SS "Enable SafeStack for sanitized targets." OFF) + +set(FLAG_CANDIDATES "-g -fsanitize=safe-stack") + +# There might be some conflict with the other sanitizer +# hence it might need an if statement here. + +# add some handy functions +include(sanitize-helpers) + +if(SANITIZE_SS) + sanitizer_check_compiler_flags("${FLAG_CANDIDATES}" "SafeStack" "SS") +endif() + +function(add_sanitize_ss TARGET) + sanitizer_check_target(${TARGET}) + sanitizer_add_flags(${TARGET} "SafeStack" "SS") +endfunction() diff --git a/thirdparty/sanitizers/FindSanitizers.cmake b/thirdparty/sanitizers/FindSanitizers.cmake index bd6af85..53d1b27 100644 --- a/thirdparty/sanitizers/FindSanitizers.cmake +++ b/thirdparty/sanitizers/FindSanitizers.cmake @@ -36,6 +36,9 @@ find_package(ASan ${FIND_QUIETLY_FLAG}) find_package(TSan ${FIND_QUIETLY_FLAG}) find_package(MSan ${FIND_QUIETLY_FLAG}) find_package(UBSan ${FIND_QUIETLY_FLAG}) +find_package(LeakSan ${FIND_QUIETLY_FLAG}) +find_package(CFI ${FIND_QUIETLY_FLAG}) +find_package(SS ${FIND_QUIETLY_FLAG}) function(sanitizer_add_blacklist_file FILE) if(NOT IS_ABSOLUTE ${FILE}) @@ -52,7 +55,11 @@ function(add_sanitizers ...) (SANITIZE_ADDRESS OR SANITIZE_MEMORY OR SANITIZE_THREAD - OR SANITIZE_UNDEFINED)) + OR SANITIZE_UNDEFINED + OR SANITIZE_LEAK + OR SANITIZE_CFI + OR SANITIZE_SS)) + message(STATUS "No sanitizer selected.") return() endif() @@ -89,5 +96,14 @@ function(add_sanitizers ...) if(SANITIZE_UNDEFINED) add_sanitize_undefined(${TARGET}) endif() + if(SANITIZE_LEAK) + add_sanitize_leak(${TARGET}) + endif() + if(SANITIZE_CFI) + add_sanitize_cfi(${TARGET}) + endif() + if(SANITIZE_SS) + add_sanitize_ss(${TARGET}) + endif() endforeach() endfunction(add_sanitizers)