@@ -41,7 +41,6 @@ function(sourcemeta_add_default_options visibility target)
4141 -Woverloaded-virtual
4242 -Winvalid-offsetof
4343 -funroll-loops
44- -fstrict-aliasing
4544 -ftree-vectorize
4645
4746 # To improve how much GCC/Clang will vectorize
@@ -51,7 +50,41 @@ function(sourcemeta_add_default_options visibility target)
5150 # multiplication wraps around using twos-complement representation
5251 # See https://users.cs.utah.edu/~regehr/papers/overflow12.pdf
5352 # See https://www.postgresql.org/message-id/1689.1134422394@sss.pgh.pa.us
54- -fwrapv )
53+ -fwrapv
54+
55+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
56+ -Wformat
57+ -Wformat=2
58+ -Werror=format-security
59+ -fstack-protector-strong )
60+
61+ # Control-flow protection: requires hardware and OS support
62+ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" )
63+ # -fcf-protection uses Intel CET (Control-flow Enforcement Technology)
64+ # Requires OS kernel support, primarily available on Linux
65+ if (LINUX )
66+ target_compile_options ("${target} " ${visibility} -fcf-protection=full )
67+ endif ()
68+ elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" )
69+ # -mbranch-protection uses ARM BTI/PAC, requires Linux kernel 5.8+
70+ if (LINUX )
71+ target_compile_options ("${target} " ${visibility} -mbranch-protection=standard )
72+ endif ()
73+ endif ()
74+
75+ # _FORTIFY_SOURCE requires optimization (-O1 or higher), so only enable in Release builds
76+ # First undefine to avoid conflicts, then define
77+ target_compile_options ("${target} " ${visibility}
78+ $<$<CONFIG :Release >:-U_FORTIFY_SOURCE >
79+ $<$<CONFIG :RelWithDebInfo >:-U_FORTIFY_SOURCE >)
80+ target_compile_definitions ("${target} " ${visibility}
81+ $<$<CONFIG :Release >:_FORTIFY_SOURCE =3>
82+ $<$<CONFIG :RelWithDebInfo >:_FORTIFY_SOURCE =3>)
83+
84+ # _GLIBCXX_ASSERTIONS is libstdc++ (GNU) specific, not applicable to libc++ (LLVM/macOS)
85+ if (NOT APPLE AND SOURCEMETA_COMPILER_GCC)
86+ target_compile_definitions ("${target} " ${visibility} $<$<CONFIG :Debug >:_GLIBCXX_ASSERTIONS >)
87+ endif ()
5588 endif ()
5689
5790 if (SOURCEMETA_COMPILER_LLVM)
@@ -80,6 +113,11 @@ function(sourcemeta_add_default_options visibility target)
80113 -fvectorize
81114 # Enable vectorization of straight-line code for performance
82115 -fslp-vectorize )
116+
117+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
118+ target_compile_options ("${target} " ${visibility}
119+ $<$<CONFIG :Release >:-fno -delete -null -pointer -checks -fno -strict -aliasing -ftrivial -auto -var -init =zero >
120+ $<$<CONFIG :RelWithDebInfo >:-fno -delete -null -pointer -checks -fno -strict -aliasing -ftrivial -auto -var -init =zero >)
83121 elseif (SOURCEMETA_COMPILER_GCC)
84122 target_compile_options ("${target} " ${visibility}
85123 -fno-trapping-math
@@ -88,7 +126,18 @@ function(sourcemeta_add_default_options visibility target)
88126 # GCC seems to print a lot of false-positives here
89127 -Wno-free-nonheap-object
90128 # Disables runtime type information
91- -fno-rtti )
129+ -fno-rtti
130+
131+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
132+ -Wtrampolines
133+ -Wbidi-chars=any
134+ -fstack-clash-protection
135+ -fstrict-flex-arrays=3 )
136+
137+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
138+ target_compile_options ("${target} " ${visibility}
139+ $<$<CONFIG :Release >:-fno -delete -null -pointer -checks -fno -strict -overflow -fno -strict -aliasing -ftrivial -auto -var -init =zero >
140+ $<$<CONFIG :RelWithDebInfo >:-fno -delete -null -pointer -checks -fno -strict -overflow -fno -strict -aliasing -ftrivial -auto -var -init =zero >)
92141 endif ()
93142endfunction ()
94143
0 commit comments