This is the mail archive of the
gdb-prs@sourceware.org
mailing list for the GDB project.
[Bug exp/17904] "Cannot access memory at address 0x0" for function returning reference evaluated within EVAL_AVOID_SIDE_EFFECTS
- From: "ed at catmur dot co.uk" <sourceware-bugzilla at sourceware dot org>
- To: gdb-prs at sourceware dot org
- Date: Fri, 30 Jan 2015 13:35:16 +0000
- Subject: [Bug exp/17904] "Cannot access memory at address 0x0" for function returning reference evaluated within EVAL_AVOID_SIDE_EFFECTS
- Auto-submitted: auto-generated
- References: <bug-17904-4717 at http dot sourceware dot org/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=17904
--- Comment #1 from Ed Catmur <ed at catmur dot co.uk> ---
Here's a test:
gdb/testsuite/gdb.cp/pr17904.cc
int&
func ()
{
static int i;
return i;
}
int
main ()
{
}
gdb/testsuite/gdb.cp/pr17904.exp
if {[skip_cplus_tests]} { continue }
standard_testfile .cc
if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
return -1
}
if {![runto_main]} {
return -1
}
gdb_test "p 0 || +func()" ".* = false" "reference return"
And a suggested patch (works, but I'm not too sure about correctness):
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -3650,6 +3650,7 @@ coerce_ref (struct value *arg)
{
struct type *value_type_arg_tmp = check_typedef (value_type (arg));
struct value *retval;
+ CORE_ADDR addr;
struct type *enc_type;
retval = coerce_ref_if_computed (arg);
@@ -3662,9 +3663,12 @@ coerce_ref (struct value *arg)
enc_type = check_typedef (value_enclosing_type (arg));
enc_type = TYPE_TARGET_TYPE (enc_type);
- retval = value_at_lazy (enc_type,
- unpack_pointer (value_type (arg),
- value_contents (arg)));
+ addr = unpack_pointer (value_type (arg), value_contents (arg));
+
+ if (VALUE_LVAL (arg) == not_lval && addr == 0)
+ return allocate_value (enc_type);
+
+ retval = value_at_lazy (enc_type, addr);
enc_type = value_type (retval);
return readjust_indirect_value_type (retval, enc_type,
value_type_arg_tmp, arg);
--
You are receiving this mail because:
You are on the CC list for the bug.