[libc] default enable -ftrivial-auto-var-init=pattern (#78776)
Usage of uninitialized memory is a top memory safety issue in C++ codebases. Help mitigate this somewhat by default initialize stack allocations to a pattern (0xAA repeating). Clang has received optimizations to sink these into control flow paths that access such values to minimize the overhead of these added initializations. If there's a measurable slowdown, we can add -ftrivial-auto-var-init-max-size=<N> for some value N bytes if we have any large stack allocations, or add attribute uninitialized to any variable declarations. Unsupported until GCC 12.1 / Clang 8. Increases file size of libc.a from a full build by +8.79Ki (+0.2%).
This commit is contained in:
@@ -57,3 +57,8 @@ foreach(feature IN LISTS ALL_COMPILER_FEATURES)
|
||||
endforeach()
|
||||
|
||||
message(STATUS "Compiler features available: ${AVAILABLE_COMPILER_FEATURES}")
|
||||
|
||||
### Compiler Feature Detection ###
|
||||
|
||||
# clang-8+, gcc-12+
|
||||
check_cxx_compiler_flag("-ftrivial-auto-var-init=pattern" LIBC_CC_SUPPORTS_PATTERN_INIT)
|
||||
|
||||
@@ -41,6 +41,9 @@ function(_get_common_compile_options output_var flags)
|
||||
list(APPEND compile_options "-fno-unwind-tables")
|
||||
list(APPEND compile_options "-fno-asynchronous-unwind-tables")
|
||||
list(APPEND compile_options "-fno-rtti")
|
||||
if (LIBC_CC_SUPPORTS_PATTERN_INIT)
|
||||
list(APPEND compile_options "-ftrivial-auto-var-init=pattern")
|
||||
endif()
|
||||
list(APPEND compile_options "-Wall")
|
||||
list(APPEND compile_options "-Wextra")
|
||||
# -DLIBC_WNO_ERROR=ON if you can't build cleanly with -Werror.
|
||||
|
||||
@@ -81,7 +81,12 @@ def libc_function(
|
||||
# We use the explicit equals pattern here because append and += mutate the
|
||||
# original list, where this creates a new list and stores it in deps.
|
||||
copts = copts or []
|
||||
copts = copts + ["-O3", "-fno-builtin", "-fno-lax-vector-conversions"]
|
||||
copts = copts + [
|
||||
"-O3",
|
||||
"-fno-builtin",
|
||||
"-fno-lax-vector-conversions",
|
||||
"-ftrivial-auto-var-init=pattern"
|
||||
]
|
||||
|
||||
# We compile the code twice, the first target is suffixed with ".__internal__" and contains the
|
||||
# C++ functions in the "LIBC_NAMESPACE" namespace. This allows us to test the function in the
|
||||
|
||||
Reference in New Issue
Block a user