From 2685aae8afcfac972861d295c41a1fbab2bcd6e3 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Wed, 9 Mar 2011 18:10:24 +0100 Subject: [PATCH] dwarflint: Properly diagnose DW_AT_sibling with value of 0 --- dwarflint/check_debug_info.cc | 19 ++++++++++++++++++- dwarflint/tests/garbage-8.bz2 | Bin 0 -> 2753 bytes dwarflint/tests/run-bad.sh | 6 +++++- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 dwarflint/tests/garbage-8.bz2 diff --git a/dwarflint/check_debug_info.cc b/dwarflint/check_debug_info.cc index b712daab2..7d7b293c5 100644 --- a/dwarflint/check_debug_info.cc +++ b/dwarflint/check_debug_info.cc @@ -507,6 +507,21 @@ namespace ref_record_add (&ctx->cu->decl_file_refs, value, ctx->where); } + /* The real sibling checking takes place down in read_die_chain. + Here we just make sure that the value is non-zero. That value is + clearly invalid, and we use it to mark absent DW_AT_sibling. */ + void + check_sibling_non0 (uint64_t addr, struct value_check_cb_ctx const *ctx) + { + if (addr == 0) + { + wr_error (*ctx->where) + << "DW_AT_sibling with a value of 0." << std::endl; + // Don't let this up. + *ctx->retval_p = -2; + } + } + /* Returns: -2 in case of error that we have to note and return, but for now @@ -889,9 +904,11 @@ namespace siblings. */ assert (value_check_cb == check_die_ref_local || value_check_cb == check_die_ref_global); + value_check_cb = check_sibling_non0; valuep = &sibling_addr; } - else if (value_check_cb != NULL) + + if (value_check_cb != NULL) value_check_cb (value, &cb_ctx); /* Store the relocated value. Note valuep may point to diff --git a/dwarflint/tests/garbage-8.bz2 b/dwarflint/tests/garbage-8.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b9889832a30f604cccc79d63ff636819048cdc6d GIT binary patch literal 2753 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 HNpEPdpsDQ_ literal 0 Hc-jL100001 diff --git a/dwarflint/tests/run-bad.sh b/dwarflint/tests/run-bad.sh index 423e1f418..39fbdb5f4 100755 --- a/dwarflint/tests/run-bad.sh +++ b/dwarflint/tests/run-bad.sh @@ -28,7 +28,7 @@ srcdir=$srcdir/tests testfiles hello.bad-1 hello.bad-3 garbage-1 garbage-2 garbage-3 garbage-4 \ - garbage-5 garbage-6 garbage-7 + garbage-5 garbage-6 garbage-7 garbage-8 testrun_compare ./dwarflint hello.bad-1 <