@@ -7,7 +7,9 @@ function(sourcemeta_add_default_options visibility target)
77 $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/W4 >
88 $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/WL >
99 $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/MP >
10- $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/sdl >)
10+ $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/sdl >
11+ # See https://learn.microsoft.com/en-us/cpp/build/reference/guard-enable-control-flow-guard
12+ $<$<OR :$<COMPILE_LANGUAGE :C >,$<COMPILE_LANGUAGE :CXX >>:/guard :cf >)
1113 elseif (SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
1214 target_compile_options ("${target} " ${visibility}
1315 -Wall
@@ -41,7 +43,6 @@ function(sourcemeta_add_default_options visibility target)
4143 $<$<OR :$<COMPILE_LANGUAGE :CXX >,$<COMPILE_LANGUAGE :OBJCXX >>:-Woverloaded -virtual >
4244 $<$<OR :$<COMPILE_LANGUAGE :CXX >,$<COMPILE_LANGUAGE :OBJCXX >>:-Winvalid -offsetof >
4345 -funroll-loops
44- -fstrict-aliasing
4546 -ftree-vectorize
4647
4748 # To improve how much GCC/Clang will vectorize
@@ -51,7 +52,33 @@ function(sourcemeta_add_default_options visibility target)
5152 # multiplication wraps around using twos-complement representation
5253 # See https://users.cs.utah.edu/~regehr/papers/overflow12.pdf
5354 # See https://www.postgresql.org/message-id/[email protected] 54- -fwrapv )
55+ -fwrapv
56+
57+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
58+ -Wformat
59+ -Wformat=2
60+ -Werror=format-security
61+ -fstack-protector-strong
62+ -fstrict-flex-arrays=3 )
63+
64+ # Control-flow protection: requires hardware and OS support
65+ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" )
66+ # -fcf-protection uses Intel CET (Control-flow Enforcement Technology)
67+ # Requires OS kernel support, primarily available on Linux
68+ if (SOURCEMETA_OS_LINUX)
69+ target_compile_options ("${target} " ${visibility} -fcf-protection=full )
70+ endif ()
71+ elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" )
72+ # -mbranch-protection uses ARM BTI/PAC, requires Linux kernel 5.8+
73+ if (SOURCEMETA_OS_LINUX)
74+ target_compile_options ("${target} " ${visibility} -mbranch-protection=standard )
75+ endif ()
76+ endif ()
77+
78+ # _GLIBCXX_ASSERTIONS is libstdc++ (GNU) specific, not applicable to libc++ (LLVM/macOS)
79+ if (NOT APPLE AND SOURCEMETA_COMPILER_GCC)
80+ target_compile_definitions ("${target} " ${visibility} $<$<CONFIG :Debug >:_GLIBCXX_ASSERTIONS >)
81+ endif ()
5582 endif ()
5683
5784 if (SOURCEMETA_COMPILER_LLVM)
@@ -80,6 +107,11 @@ function(sourcemeta_add_default_options visibility target)
80107 -fvectorize
81108 # Enable vectorization of straight-line code for performance
82109 -fslp-vectorize )
110+
111+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
112+ target_compile_options ("${target} " ${visibility}
113+ $<$<CONFIG :Release >:-fno -delete -null -pointer -checks ;-ftrivial -auto -var -init =zero >
114+ $<$<CONFIG :RelWithDebInfo >:-fno -delete -null -pointer -checks ;-ftrivial -auto -var -init =zero >)
83115 elseif (SOURCEMETA_COMPILER_GCC)
84116 target_compile_options ("${target} " ${visibility}
85117 -fno-trapping-math
@@ -88,22 +120,16 @@ function(sourcemeta_add_default_options visibility target)
88120 # GCC seems to print a lot of false-positives here
89121 -Wno-free-nonheap-object
90122 # Disables runtime type information
91- $<$<OR :$<COMPILE_LANGUAGE :CXX >,$<COMPILE_LANGUAGE :OBJCXX >>:-fno -rtti >)
92- endif ()
93- endfunction ()
123+ $<$<OR :$<COMPILE_LANGUAGE :CXX >,$<COMPILE_LANGUAGE :OBJCXX >>:-fno -rtti >
94124
95- # For studying failed vectorization results
96- # - On Clang , seems to only take effect on release shared builds
97- # - On GCC, seems to only take effect on release shared builds
98- function (sourcemeta_add_vectorization_diagnostics target )
99- if (SOURCEMETA_COMPILER_LLVM)
100- # See https://llvm.org/docs/Vectorizers.html#id6
101- target_compile_options ("${target} " PRIVATE
102- -Rpass-analysis=loop-vectorize
103- -Rpass-missed=loop-vectorize )
104- elseif (SOURCEMETA_COMPILER_GCC)
105- target_compile_options ("${target} " PRIVATE
106- -fopt-info-vec-missed
107- -fopt-info-loop-missed )
125+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
126+ -Wtrampolines
127+ -Wbidi-chars=any
128+ -fstack-clash-protection )
129+
130+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
131+ target_compile_options ("${target} " ${visibility}
132+ $<$<CONFIG :Release >:-fno -delete -null -pointer -checks -ftrivial -auto -var -init =zero >
133+ $<$<CONFIG :RelWithDebInfo >:-fno -delete -null -pointer -checks -ftrivial -auto -var -init =zero >)
108134 endif ()
109135endfunction ()
0 commit comments