Skip to content

Commit aec701a

Browse files
committed
Review compiler options for Clang and GCC
Signed-off-by: Juan Cruz Viotti <[email protected]>
1 parent 639d617 commit aec701a

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

cmake/common/compiler/options.cmake

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,29 @@ function(sourcemeta_add_default_options visibility target)
5151
# multiplication wraps around using twos-complement representation
5252
# See https://users.cs.utah.edu/~regehr/papers/overflow12.pdf
5353
# See https://www.postgresql.org/message-id/[email protected]
54-
-fwrapv)
54+
-fwrapv
55+
56+
# See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
57+
-Wformat
58+
-Wformat=2
59+
-Werror=format-security
60+
-fstrict-flex-arrays=3
61+
-fstack-clash-protection
62+
-fstack-protector-strong
63+
-Werror=implicit
64+
-Werror=incompatible-pointer-types)
65+
66+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
67+
target_compile_options("${target}" ${visibility} -fcf-protection=full)
68+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
69+
target_compile_options("${target}" ${visibility} -mbranch-protection=standard)
70+
endif()
71+
72+
target_compile_definitions("${target}" ${visibility} _FORTIFY_SOURCE=3)
73+
target_compile_definitions("${target}" ${visibility} $<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>)
74+
target_compile_options("${target}" ${visibility}
75+
$<$<CONFIG:Release>:-fno-delete-null-pointer-checks -fno-strict-overflow -fno-strict-aliasing -ftrivial-auto-var-init=zero>
76+
$<$<CONFIG:RelWithDebInfo>:-fno-delete-null-pointer-checks -fno-strict-overflow -fno-strict-aliasing -ftrivial-auto-var-init=zero>)
5577
endif()
5678

5779
if(SOURCEMETA_COMPILER_LLVM)
@@ -88,7 +110,11 @@ function(sourcemeta_add_default_options visibility target)
88110
# GCC seems to print a lot of false-positives here
89111
-Wno-free-nonheap-object
90112
# Disables runtime type information
91-
-fno-rtti)
113+
-fno-rtti
114+
115+
# See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
116+
-Wtrampolines
117+
-Wbidi-chars=any)
92118
endif()
93119
endfunction()
94120

cmake/common/targets/executable.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,20 @@ function(sourcemeta_executable)
3030

3131
add_executable("${TARGET_NAME}" ${SOURCEMETA_EXECUTABLE_SOURCES})
3232
sourcemeta_add_default_options(PRIVATE ${TARGET_NAME})
33+
34+
# See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
35+
if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
36+
target_compile_options(${TARGET_NAME} PRIVATE
37+
$<$<CONFIG:Release>:-fPIE -pie>
38+
$<$<CONFIG:RelWithDebInfo>:-fPIE -pie>)
39+
target_link_options(${TARGET_NAME} PRIVATE
40+
-Wl,-z,nodlopen
41+
-Wl,-z,noexecstack
42+
-Wl,-z,relro
43+
-Wl,-z,now
44+
-Wl,--as-needed
45+
-Wl,--no-copy-dt-needed-entries)
46+
endif()
47+
3348
set_target_properties("${TARGET_NAME}" PROPERTIES FOLDER "${FOLDER_NAME}")
3449
endfunction()

0 commit comments

Comments
 (0)