summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/msan/msan.cc8
-rw-r--r--lib/msan/msan_chained_origin_depot.cc2
-rw-r--r--lib/msan/msan_origin.h1
-rw-r--r--lib/msan/msan_report.cc4
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);