Skip to content

Commit cde4599

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

File tree

3 files changed

+58
-25
lines changed

3 files changed

+58
-25
lines changed

cmake/FindPCRE2.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ if(NOT PCRE2_FOUND)
103103
target_compile_options(sljit PRIVATE -Wno-conditional-uninitialized)
104104
endif()
105105

106+
if(SOURCEMETA_COMPILER_GCC)
107+
target_compile_options(sljit PRIVATE -Wno-stringop-overflow)
108+
target_compile_options(sljit PRIVATE -fstrict-flex-arrays=0)
109+
endif()
110+
106111
if(SOURCEMETA_COMPILER_MSVC)
107112
target_compile_options(sljit PRIVATE /sdl-)
108113
target_compile_options(sljit PRIVATE /wd4701)
@@ -140,6 +145,11 @@ if(NOT PCRE2_FOUND)
140145
target_compile_options(pcre2 PRIVATE -Wno-type-limits)
141146
endif()
142147

148+
if(SOURCEMETA_COMPILER_GCC)
149+
target_compile_options(pcre2 PRIVATE -Wno-stringop-overflow)
150+
target_compile_options(pcre2 PRIVATE -fstrict-flex-arrays=0)
151+
endif()
152+
143153
if(SOURCEMETA_COMPILER_MSVC)
144154
target_compile_options(pcre2 PRIVATE /sdl-)
145155
target_compile_options(pcre2 PRIVATE /wd4127)

cmake/common/compiler/options.cmake

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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()
109135
endfunction()

cmake/common/targets/executable.cmake

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,9 @@ function(sourcemeta_executable)
3232
sourcemeta_add_default_options(PRIVATE ${TARGET_NAME})
3333

3434
# See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
35-
# Position Independent Executable (PIE) for ASLR support
35+
# PIE linker flags for ASLR support. The compile-time -fPIC is already
36+
# enabled globally via CMAKE_POSITION_INDEPENDENT_CODE in defaults.cmake.
3637
if(SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
37-
target_compile_options(${TARGET_NAME} PRIVATE
38-
$<$<CONFIG:Release>:-fPIE>
39-
$<$<CONFIG:RelWithDebInfo>:-fPIE>
40-
$<$<CONFIG:MinSizeRel>:-fPIE>)
4138
target_link_options(${TARGET_NAME} PRIVATE
4239
$<$<CONFIG:Release>:-pie>
4340
$<$<CONFIG:RelWithDebInfo>:-pie>
@@ -46,8 +43,8 @@ function(sourcemeta_executable)
4643

4744
# See https://learn.microsoft.com/en-us/cpp/build/reference/guard-enable-control-flow-guard
4845
# See https://learn.microsoft.com/en-us/cpp/build/reference/cetcompat
46+
# The /guard:cf compile flag is in sourcemeta_add_default_options()
4947
if(SOURCEMETA_COMPILER_MSVC)
50-
target_compile_options(${TARGET_NAME} PRIVATE /guard:cf)
5148
target_link_options(${TARGET_NAME} PRIVATE /guard:cf /CETCOMPAT)
5249
endif()
5350

0 commit comments

Comments
 (0)