Просмотр исходного кода

Print ubsan stack traces (#5429)

Ran into this trying to debug #5428 

Before:

```
lex.cpp:793:21: runtime error: null pointer passed as argument 1, which is declared to never be null
string.h:90:51: note: nonnull attribute specified here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior lex.cpp:793:21
```

After:

```
lex.cpp:793:21: runtime error: null pointer passed as argument 1, which is declared to never be null
string.h:90:51: note: nonnull attribute specified here
    #0 0x5572db22a680 in Carbon::Lex::Lexer::MakeLines(llvm::StringRef) /proc/self/cwd/toolchain/lex/lex.cpp:793:14
    #1 0x5572db227ee4 in Lex /proc/self/cwd/toolchain/lex/lex.cpp:738:3
(etc)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior lex.cpp:793:21
```

Interestingly, even though this is labelled as UB, it's using the
ASAN_SYMBOLIZER_PATH (specifically not LLVM_SYMBOLIZER_PATH). But
canonically UBSAN_SYMBOLIZER_PATH may also be used per
https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/ubsan/ubsan_flags.cpp#L53,
so I'm adding it to the list out of an excess of caution.

Also doing some small related cleanup:

- Removing `ASAN_SYMBOLIZER_PATH` from `--test_env` because it should
now be getting overridden by these settings (also was a little
inconsistent in that `LLVM_SYMBOLIZER_PATH` was not included).
- Improving the environment construction and documentation.
Jon Ross-Perkins 1 год назад
Родитель
Сommit
7b9ec95118
2 измененных файлов с 19 добавлено и 20 удалено
  1. 0 4
      .bazelrc
  2. 19 16
      bazel/cc_toolchains/defs.bzl

+ 0 - 4
.bazelrc

@@ -93,10 +93,6 @@ common:asan --custom_malloc=@bazel_tools//tools/cpp:malloc
 # Configuration for enabling LibFuzzer (along with ASan).
 common:fuzzer --features=fuzzer
 
-# Always allow tests to symbolize themselves with whatever `llvm-symbolize` is
-# in the users environment.
-common --test_env=ASAN_SYMBOLIZER_PATH
-
 # Force actions to have a UTF-8 language encoding.
 # TODO: Need to investigate what this should be on Windows, but at least for
 # Linux and macOS this seems strictly better than the Bazel default of just

+ 19 - 16
bazel/cc_toolchains/defs.bzl

@@ -24,20 +24,23 @@ def cc_env():
     it's difficult to modify default behaviors.
     """
 
-    # On macOS, there's a nano zone allocation warning due to asan (arises
-    # in fastbuild/dbg). This suppresses the warning in `bazel run`.
-    #
-    # Concatenation of a dict with a select isn't supported, so we concatenate
-    # within the select.
-    # https://github.com/bazelbuild/bazel/issues/12457
-    return select({
-        "//bazel/cc_toolchains:macos_asan": {
-            "ASAN_SYMBOLIZER_PATH": llvm_symbolizer,
-            "LLVM_SYMBOLIZER_PATH": llvm_symbolizer,
-            "MallocNanoZone": "0",
-        },
-        "//conditions:default": {
-            "ASAN_SYMBOLIZER_PATH": llvm_symbolizer,
-            "LLVM_SYMBOLIZER_PATH": llvm_symbolizer,
-        },
+    # Settings which apply cross-platform.
+    # buildifier: disable=unsorted-dict-items
+    common_env = {
+        "LLVM_SYMBOLIZER_PATH": llvm_symbolizer,
+        # Sanitizers don't use LLVM as fallback, but sometimes ASAN may be used
+        # for UBSAN errors; we still set UBSAN in case it's directly used.
+        "ASAN_SYMBOLIZER_PATH": llvm_symbolizer,
+        "UBSAN_SYMBOLIZER_PATH": llvm_symbolizer,
+        # Default to printing traces for UBSAN.
+        "UBSAN_OPTIONS": "print_stacktrace=1",
+    }
+
+    # On macOS, there's a nano zone allocation warning when asan is enabled.
+    # This suppresses the warning in `bazel run`.
+    macos_env = {"MallocNanoZone": "0"}
+
+    return common_env | select({
+        "//bazel/cc_toolchains:macos_asan": macos_env,
+        "//conditions:default": {},
     })