]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sandbox: Add support for Address Sanitizer
authorAndrew Scull <ascull@google.com>
Mon, 30 May 2022 10:00:05 +0000 (10:00 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 23 Jun 2022 16:58:18 +0000 (12:58 -0400)
Add CONFIG_ASAN to build with the Address Sanitizer. This only works
with the sandbox so the config is likewise dependent. The resulting
executable will have ASAN instrumentation, including the leak detector
that can be disabled with the ASAN_OPTIONS environment variable:

   ASAN_OPTIONS=detect_leaks=0 ./u-boot

Since u-boot uses its own dlmalloc, dynamic allocations aren't
automatically instrumented, but stack variables and globals are.

Instrumentation could be added to dlmalloc to poison and unpoison memory
as it is allocated and deallocated, and to introduce redzones between
allocations. Alternatively, the sandbox may be able to play games with
the system allocator and somehow still keep the required memory
abstraction. No effort to address dynamic allocation is made by this
patch.

The config is not yet enabled for any targets by default.

Signed-off-by: Andrew Scull <ascull@google.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Kconfig
arch/sandbox/config.mk

diff --git a/Kconfig b/Kconfig
index 429b5f9a70dc32c9115103d3a00bf0c44a436a95..6b97a0236f8cc97f2be48d67bc44302547d64fe6 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -154,6 +154,13 @@ config CC_COVERAGE
          Enabling this option will pass "--coverage" to gcc to compile
          and link code instrumented for coverage analysis.
 
+config ASAN
+       bool "Enable AddressSanitizer"
+       depends on SANDBOX
+       help
+         Enables AddressSanitizer to discover out-of-bounds accesses,
+         use-after-free, double-free and memory leaks.
+
 config CC_HAS_ASM_INLINE
        def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
 
index f3d3af66116a6f1bc1877217b90a8560aac4780b..410603252ee0396e1bf1364668ffc12cc6c01ecd 100644 (file)
@@ -15,8 +15,16 @@ PLATFORM_LIBS += $(shell $(SDL_CONFIG) --libs)
 PLATFORM_CPPFLAGS += $(shell $(SDL_CONFIG) --cflags)
 endif
 
+SANITIZERS :=
+ifdef CONFIG_ASAN
+SANITIZERS     += -fsanitize=address
+endif
+KBUILD_CFLAGS  += $(SANITIZERS)
+
 cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
-       $(KBUILD_LDFLAGS:%=-Wl,%)$(LTO_FINAL_LDFLAGS) \
+       $(KBUILD_LDFLAGS:%=-Wl,%) \
+       $(SANITIZERS) \
+       $(LTO_FINAL_LDFLAGS) \
        -Wl,--whole-archive \
                $(u-boot-main) \
                $(u-boot-keep-syms-lto) \
@@ -24,7 +32,9 @@ cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
        $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map
 
 cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
-       $(KBUILD_LDFLAGS:%=-Wl,%) $(LTO_FINAL_LDFLAGS) \
+       $(KBUILD_LDFLAGS:%=-Wl,%) \
+       $(SANITIZERS) \
+       $(LTO_FINAL_LDFLAGS) \
        $(patsubst $(obj)/%,%,$(u-boot-spl-init)) \
        -Wl,--whole-archive \
                $(patsubst $(obj)/%,%,$(u-boot-spl-main)) \