diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-06 12:58:44 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-06 12:58:44 +0000 |
commit | 1706c796ee11d0396958d3cf1b9fca0e89d909cc (patch) | |
tree | 2c217fbe789d0c015cc4c97e523a8c02909b20db | |
parent | c4df0de047f1a204590d7c1fcb26a335370a4fbe (diff) |
[msan] Better diagnostic for invalid origin id.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@210331 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/msan/msan.cc | 8 | ||||
-rw-r--r-- | lib/msan/msan_chained_origin_depot.cc | 2 | ||||
-rw-r--r-- | lib/msan/msan_origin.h | 1 | ||||
-rw-r--r-- | lib/msan/msan_report.cc | 4 |
4 files changed, 8 insertions, 7 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index 5ee92bff1..15714e7d5 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -197,10 +197,6 @@ void PrintWarning(uptr pc, uptr bp) { PrintWarningWithOrigin(pc, bp, __msan_origin_tls); } -bool OriginIsValid(u32 origin) { - return origin != 0 && origin != (u32)-1; -} - void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin) { if (msan_expect_umr) { // Printf("Expected UMR\n"); @@ -214,10 +210,10 @@ void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin) { GET_FATAL_STACK_TRACE_PC_BP(pc, bp); u32 report_origin = - (__msan_get_track_origins() && OriginIsValid(origin)) ? origin : 0; + (__msan_get_track_origins() && Origin(origin).isValid()) ? origin : 0; ReportUMR(&stack, report_origin); - if (__msan_get_track_origins() && !OriginIsValid(origin)) { + if (__msan_get_track_origins() && !Origin(origin).isValid()) { Printf( " ORIGIN: invalid (%x). Might be a bug in MemorySanitizer origin " "tracking.\n This could still be a bug in your code, too!\n", diff --git a/lib/msan/msan_chained_origin_depot.cc b/lib/msan/msan_chained_origin_depot.cc index a98bcf5d0..0336a1067 100644 --- a/lib/msan/msan_chained_origin_depot.cc +++ b/lib/msan/msan_chained_origin_depot.cc @@ -20,7 +20,7 @@ struct ChainedOriginDepotDesc { u32 here_id; u32 prev_id; u32 hash() const { return here_id ^ prev_id; } - bool is_valid() { return true; } + bool is_valid() { return here_id && prev_id; } }; struct ChainedOriginDepotNode { diff --git a/lib/msan/msan_origin.h b/lib/msan/msan_origin.h index 64acf1e06..a4156507b 100644 --- a/lib/msan/msan_origin.h +++ b/lib/msan/msan_origin.h @@ -66,6 +66,7 @@ class Origin { u32 raw_id() const { return raw_id_; } bool isStackRoot() const { return raw_id_ == kStackRoot; } bool isHeapRoot() const { return raw_id_ == kHeapRoot; } + bool isValid() const { return raw_id_ != 0 && raw_id_ != (u32)-1; } private: u32 raw_id_; diff --git a/lib/msan/msan_report.cc b/lib/msan/msan_report.cc index 99ea09ce9..8a3fd04cb 100644 --- a/lib/msan/msan_report.cc +++ b/lib/msan/msan_report.cc @@ -63,6 +63,10 @@ static void DescribeOrigin(u32 id) { Decorator d; while (true) { Origin o(id); + if (!o.isValid()) { + Printf(" %sinvalid origin id(%d)%s\n", d.Warning(), id, d.End()); + break; + } u32 prev_id; u32 stack_id = ChainedOriginDepotGet(o.id(), &prev_id); Origin prev_o(prev_id); |