[asan] Allow changing verbosity in activation flags.
This change removes some debug output in asan_flags.cc that was reading the verbosity level before all the flags were parsed. llvm-svn: 226566
This commit is contained in:
parent
46ad7f7ec5
commit
f074b3c2de
|
@ -53,6 +53,7 @@ static struct AsanDeactivatedFlags {
|
|||
f.poison_heap = poison_heap;
|
||||
cf.coverage = coverage;
|
||||
cf.coverage_dir = coverage_dir;
|
||||
cf.verbosity = Verbosity();
|
||||
cf.help = false; // this is activation-specific help
|
||||
|
||||
// Check if activation flags need to be overriden.
|
||||
|
@ -65,7 +66,9 @@ static struct AsanDeactivatedFlags {
|
|||
GetExtraActivationFlags(buf, sizeof(buf));
|
||||
parser.ParseString(buf);
|
||||
|
||||
if (common_flags()->verbosity) ReportUnrecognizedFlags();
|
||||
SetVerbosity(cf.verbosity);
|
||||
|
||||
if (Verbosity()) ReportUnrecognizedFlags();
|
||||
|
||||
if (cf.help) parser.PrintFlagDescriptions();
|
||||
|
||||
|
@ -130,7 +133,7 @@ void AsanActivate() {
|
|||
ReInitializeAllocator(asan_deactivated_flags.allocator_options);
|
||||
|
||||
asan_is_deactivated = false;
|
||||
if (common_flags()->verbosity) {
|
||||
if (Verbosity()) {
|
||||
Report("Activated with flags:\n");
|
||||
asan_deactivated_flags.Print();
|
||||
}
|
||||
|
|
|
@ -31,4 +31,5 @@ COMMON_ACTIVATION_FLAG(bool, allocator_may_return_null)
|
|||
COMMON_ACTIVATION_FLAG(int, malloc_context_size)
|
||||
COMMON_ACTIVATION_FLAG(bool, coverage)
|
||||
COMMON_ACTIVATION_FLAG(const char *, coverage_dir)
|
||||
COMMON_ACTIVATION_FLAG(int, verbosity)
|
||||
COMMON_ACTIVATION_FLAG(bool, help)
|
||||
|
|
|
@ -60,7 +60,7 @@ FakeStack *FakeStack::Create(uptr stack_size_log) {
|
|||
|
||||
void FakeStack::Destroy(int tid) {
|
||||
PoisonAll(0);
|
||||
if (common_flags()->verbosity >= 2) {
|
||||
if (Verbosity() >= 2) {
|
||||
InternalScopedString str(kNumberOfSizeClasses * 50);
|
||||
for (uptr class_id = 0; class_id < kNumberOfSizeClasses; class_id++)
|
||||
str.append("%zd: %zd/%zd; ", class_id, hint_position_[class_id],
|
||||
|
|
|
@ -79,14 +79,10 @@ void InitializeFlags(Flags *f) {
|
|||
// Override from user-specified string.
|
||||
const char *default_options = MaybeCallAsanDefaultOptions();
|
||||
parser.ParseString(default_options);
|
||||
VReport(1, "Using the defaults from __asan_default_options: %s\n",
|
||||
MaybeCallAsanDefaultOptions());
|
||||
|
||||
// Override from command line.
|
||||
if (const char *env = GetEnv("ASAN_OPTIONS")) {
|
||||
parser.ParseString(env);
|
||||
VReport(1, "Parsed ASAN_OPTIONS: %s\n", env);
|
||||
}
|
||||
const char *env = GetEnv("ASAN_OPTIONS");
|
||||
if (env) parser.ParseString(env);
|
||||
|
||||
// Let activation flags override current settings. On Android they come
|
||||
// from a system property. On other platforms this is no-op.
|
||||
|
@ -94,11 +90,12 @@ void InitializeFlags(Flags *f) {
|
|||
char buf[100];
|
||||
GetExtraActivationFlags(buf, sizeof(buf));
|
||||
parser.ParseString(buf);
|
||||
if (buf[0] != '\0')
|
||||
VReport(1, "Parsed activation flags: %s\n", buf);
|
||||
}
|
||||
|
||||
if (common_flags()->verbosity) ReportUnrecognizedFlags();
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
|
||||
// TODO(eugenis): dump all flags at verbosity>=2?
|
||||
if (Verbosity()) ReportUnrecognizedFlags();
|
||||
|
||||
if (common_flags()->help) parser.PrintFlagDescriptions();
|
||||
|
||||
|
|
|
@ -313,7 +313,7 @@ asan_block_context_t *alloc_asan_context(void *ctxt, dispatch_function_t func,
|
|||
dispatch_function_t func) { \
|
||||
GET_STACK_TRACE_THREAD; \
|
||||
asan_block_context_t *asan_ctxt = alloc_asan_context(ctxt, func, &stack); \
|
||||
if (common_flags()->verbosity >= 2) { \
|
||||
if (Verbosity() >= 2) { \
|
||||
Report(#dispatch_x_f "(): context: %p, pthread_self: %p\n", \
|
||||
asan_ctxt, pthread_self()); \
|
||||
PRINT_CURRENT_STACK(); \
|
||||
|
@ -331,7 +331,7 @@ INTERCEPTOR(void, dispatch_after_f, dispatch_time_t when,
|
|||
dispatch_function_t func) {
|
||||
GET_STACK_TRACE_THREAD;
|
||||
asan_block_context_t *asan_ctxt = alloc_asan_context(ctxt, func, &stack);
|
||||
if (common_flags()->verbosity >= 2) {
|
||||
if (Verbosity() >= 2) {
|
||||
Report("dispatch_after_f: %p\n", asan_ctxt);
|
||||
PRINT_CURRENT_STACK();
|
||||
}
|
||||
|
@ -344,7 +344,7 @@ INTERCEPTOR(void, dispatch_group_async_f, dispatch_group_t group,
|
|||
dispatch_function_t func) {
|
||||
GET_STACK_TRACE_THREAD;
|
||||
asan_block_context_t *asan_ctxt = alloc_asan_context(ctxt, func, &stack);
|
||||
if (common_flags()->verbosity >= 2) {
|
||||
if (Verbosity() >= 2) {
|
||||
Report("dispatch_group_async_f(): context: %p, pthread_self: %p\n",
|
||||
asan_ctxt, pthread_self());
|
||||
PRINT_CURRENT_STACK();
|
||||
|
|
|
@ -74,10 +74,10 @@ void FlushUnneededASanShadowMemory(uptr p, uptr size) {
|
|||
|
||||
void AsanPoisonOrUnpoisonIntraObjectRedzone(uptr ptr, uptr size, bool poison) {
|
||||
uptr end = ptr + size;
|
||||
if (common_flags()->verbosity) {
|
||||
if (Verbosity()) {
|
||||
Printf("__asan_%spoison_intra_object_redzone [%p,%p) %zd\n",
|
||||
poison ? "" : "un", ptr, end, size);
|
||||
if (common_flags()->verbosity >= 2)
|
||||
if (Verbosity() >= 2)
|
||||
PRINT_CURRENT_STACK();
|
||||
}
|
||||
CHECK(size);
|
||||
|
|
|
@ -353,8 +353,7 @@ static void AsanInitInternal() {
|
|||
}
|
||||
#endif
|
||||
|
||||
if (common_flags()->verbosity)
|
||||
PrintAddressSpaceLayout();
|
||||
if (Verbosity()) PrintAddressSpaceLayout();
|
||||
|
||||
DisableCoreDumperIfNecessary();
|
||||
|
||||
|
|
|
@ -75,7 +75,9 @@ static void InitializeFlags(bool standalone) {
|
|||
const char *options = GetEnv("LSAN_OPTIONS");
|
||||
parser.ParseString(options);
|
||||
|
||||
if (common_flags()->verbosity) ReportUnrecognizedFlags();
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
|
||||
if (Verbosity()) ReportUnrecognizedFlags();
|
||||
|
||||
if (!help_before && common_flags()->help)
|
||||
parser.PrintFlagDescriptions();
|
||||
|
|
|
@ -157,7 +157,9 @@ static void InitializeFlags(Flags *f, const char *options) {
|
|||
|
||||
parser.ParseString(options);
|
||||
|
||||
if (common_flags()->verbosity) ReportUnrecognizedFlags();
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
|
||||
if (Verbosity()) ReportUnrecognizedFlags();
|
||||
|
||||
if (common_flags()->help) parser.PrintFlagDescriptions();
|
||||
|
||||
|
|
|
@ -255,7 +255,7 @@ void ReportUMRInsideAddressRange(const char *what, const void *start, uptr size,
|
|||
Printf("%sUninitialized bytes in %s%s%s at offset %zu inside [%p, %zu)%s\n",
|
||||
d.Warning(), d.Name(), what, d.Warning(), offset, start, size,
|
||||
d.End());
|
||||
if (__sanitizer::common_flags()->verbosity > 0)
|
||||
if (__sanitizer::Verbosity())
|
||||
DescribeMemoryRange(start, size);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@ namespace __sanitizer {
|
|||
|
||||
const char *SanitizerToolName = "SanitizerTool";
|
||||
|
||||
atomic_uint32_t current_verbosity;
|
||||
|
||||
uptr GetPageSizeCached() {
|
||||
static uptr PageSize;
|
||||
if (!PageSize)
|
||||
|
|
|
@ -41,6 +41,14 @@ const uptr kMaxThreadStackSize = 1 << 30; // 1Gb
|
|||
|
||||
extern const char *SanitizerToolName; // Can be changed by the tool.
|
||||
|
||||
extern atomic_uint32_t current_verbosity;
|
||||
INLINE void SetVerbosity(int verbosity) {
|
||||
atomic_store(¤t_verbosity, verbosity, memory_order_relaxed);
|
||||
}
|
||||
INLINE int Verbosity() {
|
||||
return atomic_load(¤t_verbosity, memory_order_relaxed);
|
||||
}
|
||||
|
||||
uptr GetPageSize();
|
||||
uptr GetPageSizeCached();
|
||||
uptr GetMmapGranularity();
|
||||
|
@ -136,11 +144,11 @@ void Report(const char *format, ...);
|
|||
void SetPrintfAndReportCallback(void (*callback)(const char *));
|
||||
#define VReport(level, ...) \
|
||||
do { \
|
||||
if ((uptr)common_flags()->verbosity >= (level)) Report(__VA_ARGS__); \
|
||||
if ((uptr)Verbosity() >= (level)) Report(__VA_ARGS__); \
|
||||
} while (0)
|
||||
#define VPrintf(level, ...) \
|
||||
do { \
|
||||
if ((uptr)common_flags()->verbosity >= (level)) Printf(__VA_ARGS__); \
|
||||
if ((uptr)Verbosity() >= (level)) Printf(__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
// Can be used to prevent mixing error reports from different sanitizers.
|
||||
|
|
|
@ -75,7 +75,7 @@ void BackgroundThread(void *arg) {
|
|||
while (true) {
|
||||
SleepForMillis(100);
|
||||
uptr current_rss_mb = GetRSS() >> 20;
|
||||
if (common_flags()->verbosity) {
|
||||
if (Verbosity()) {
|
||||
// If RSS has grown 10% since last time, print some information.
|
||||
if (prev_reported_rss * 11 / 10 < current_rss_mb) {
|
||||
Printf("%s: RSS: %zdMb\n", SanitizerToolName, current_rss_mb);
|
||||
|
|
|
@ -85,6 +85,7 @@ void InitializeFlags(Flags *f, const char *env) {
|
|||
RegisterFlag(&parser, "second_deadlock_stack", "", &f->second_deadlock_stack);
|
||||
RegisterCommonFlags(&parser);
|
||||
parser.ParseString(env);
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
}
|
||||
|
||||
void Initialize() {
|
||||
|
|
|
@ -80,7 +80,9 @@ void InitializeFlags(Flags *f, const char *env) {
|
|||
f->report_signal_unsafe = false;
|
||||
}
|
||||
|
||||
if (common_flags()->verbosity) ReportUnrecognizedFlags();
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
|
||||
if (Verbosity()) ReportUnrecognizedFlags();
|
||||
|
||||
if (common_flags()->help) parser.PrintFlagDescriptions();
|
||||
|
||||
|
|
|
@ -365,8 +365,7 @@ int Finalize(ThreadState *thr) {
|
|||
ctx->report_mtx.Unlock();
|
||||
|
||||
#ifndef SANITIZER_GO
|
||||
if (common_flags()->verbosity)
|
||||
AllocatorPrintStats();
|
||||
if (Verbosity()) AllocatorPrintStats();
|
||||
#endif
|
||||
|
||||
ThreadFinalize(thr);
|
||||
|
|
|
@ -66,6 +66,7 @@ void InitializeFlags(bool standalone) {
|
|||
parser.ParseString(MaybeCallUbsanDefaultOptions());
|
||||
// Override from environment variable.
|
||||
parser.ParseString(GetEnv("UBSAN_OPTIONS"));
|
||||
SetVerbosity(common_flags()->verbosity);
|
||||
}
|
||||
|
||||
} // namespace __ubsan
|
||||
|
|
|
@ -11,6 +11,12 @@
|
|||
// RUN: ASAN_ACTIVATION_OPTIONS=help=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-HELP
|
||||
// RUN: ASAN_OPTIONS=start_deactivated=1,verbosity=1 \
|
||||
// RUN: ASAN_ACTIVATION_OPTIONS=help=1,handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-UNSUPPORTED
|
||||
// RUN: ASAN_OPTIONS=start_deactivated=1 \
|
||||
// RUN: ASAN_ACTIVATION_OPTIONS=help=1,handle_segv=0 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-UNSUPPORTED-V0
|
||||
|
||||
// Check that verbosity=1 in activation flags affects reporting of unrecognized activation flags.
|
||||
// RUN: ASAN_OPTIONS=start_deactivated=1 \
|
||||
// RUN: ASAN_ACTIVATION_OPTIONS=help=1,handle_segv=0,verbosity=1 not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-UNSUPPORTED
|
||||
|
||||
// XFAIL: arm-linux-gnueabi
|
||||
// XFAIL: armv7l-unknown-linux-gnueabihf
|
||||
|
@ -87,6 +93,9 @@ extern "C" void do_another_bad_thing() {
|
|||
// CHECK-HELP: max_redzone
|
||||
// CHECK-HELP-NOT: handle_segv
|
||||
|
||||
// unsupported activation flags produce a warning
|
||||
// unsupported activation flags produce a warning ...
|
||||
// CHECK-UNSUPPORTED: WARNING: found 1 unrecognized
|
||||
// CHECK-UNSUPPORTED: handle_segv
|
||||
|
||||
// ... but not at verbosity=0
|
||||
// CHECK-UNSUPPORTED-V0-NOT: WARNING: found {{.*}} unrecognized
|
||||
|
|
|
@ -4,12 +4,12 @@
|
|||
// __asan_default_options() are not supported on Windows.
|
||||
// XFAIL: win32
|
||||
|
||||
const char *kAsanDefaultOptions="verbosity=1 strip_path_prefix=bar";
|
||||
const char *kAsanDefaultOptions="verbosity=1 help=1";
|
||||
|
||||
extern "C"
|
||||
__attribute__((no_sanitize_address))
|
||||
const char *__asan_default_options() {
|
||||
// CHECK: Using the defaults from __asan_default_options: {{.*}} strip_path_prefix=bar
|
||||
// CHECK: Available flags for AddressSanitizer:
|
||||
return kAsanDefaultOptions;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue