diff options
author | Luis Machado <lgustavo@codesourcery.com> | 2016-10-12 10:10:03 -0500 |
---|---|---|
committer | Luis Machado <lgustavo@codesourcery.com> | 2016-10-12 10:10:03 -0500 |
commit | 4dac951e11030b43b17f52df8bdfa7432e4bf73c (patch) | |
tree | 6fc502ccf004ba3bd3dc1ab5053c78747678b56b | |
parent | 4a2f4826907de97b089295000a67d2497aa94c99 (diff) | |
download | binutils-4dac951e11030b43b17f52df8bdfa7432e4bf73c.zip binutils-4dac951e11030b43b17f52df8bdfa7432e4bf73c.tar.gz binutils-4dac951e11030b43b17f52df8bdfa7432e4bf73c.tar.bz2 |
Fixup gdb.python/py-value.exp for bare-metal aarch64-elf
I noticed that testing aarch64-elf gdb with a physical board
ran into issues with gdb.python/py-value.exp. Further investigation showed
that we were actually trying to dereference a NULL pointer (argv) when trying
to access argv[0].
Being bare-metal, argv is not guaranteed to be valid. So we need to make sure
argv is sane before accessing argv[0].
The following patch fixes up the test program to check for a NULL argv and also
improves the testcase a bit so it doesn't have to work with a hardcoded argc
value.
Regression-tested on x86-64 Ubuntu 16.04.
gdb/testsuite/ChangeLog:
2016-10-12 Luis Machado <lgustavo@codesourcery.com>
* gdb.python/py-value.c (main): Check if argv is NULL before using it.
* gdb.python/py-value.exp (test_value_in_inferior): Don't use hardcoded
argc values.
Add 1 to argc so we guarantee distinct initial/modified argc values.
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-value.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-value.exp | 9 |
3 files changed, 21 insertions, 5 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b4ccd4a..21ee095 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-10-12 Luis Machado <lgustavo@codesourcery.com> + + * gdb.python/py-value.c (main): Check if argv is NULL before using it. + * gdb.python/py-value.exp (test_value_in_inferior): Don't use hardcoded + argc values. + Add 1 to argc so we guarantee distinct initial/modified argc values. + 2016-10-11 Jan Kratochvil <jan.kratochvil@redhat.com> * gdb.arch/powerpc-prologue.c (optimized_1): New declaration. diff --git a/gdb/testsuite/gdb.python/py-value.c b/gdb/testsuite/gdb.python/py-value.c index 586a0fd..8a8ace6 100644 --- a/gdb/testsuite/gdb.python/py-value.c +++ b/gdb/testsuite/gdb.python/py-value.c @@ -82,7 +82,7 @@ char **save_argv; int main (int argc, char *argv[]) { - char *cp = argv[0]; /* Prevent gcc from optimizing argv[] out. */ + char *cp; struct s s; union u u; PTR x = &s; @@ -99,6 +99,14 @@ main (int argc, char *argv[]) const char *sn = 0; struct str *xstr; + /* Prevent gcc from optimizing argv[] out. */ + + /* We also check for a NULL argv in case we are dealing with a target + executing in a freestanding environment, therefore there are no + guarantees about argc or argv. */ + if (argv != NULL) + cp = argv[0]; + s.a = 3; s.b = 5; u.a = 7; diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp index 662c5b4..89be659 100644 --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp @@ -274,16 +274,17 @@ proc test_value_in_inferior {} { gdb_test "python inval2 = inval+1" "gdb.MemoryError: Cannot access memory at address 0x0.*" $test gdb_test "python inval.fetch_lazy ()" "gdb.MemoryError: Cannot access memory at address 0x0.*" $test } + set argc_value [get_integer_valueof "argc" 0] gdb_test "python argc_lazy = gdb.parse_and_eval('argc')" gdb_test "python argc_notlazy = gdb.parse_and_eval('argc')" gdb_test "python argc_notlazy.fetch_lazy()" gdb_test "python print (argc_lazy.is_lazy)" "True" gdb_test "python print (argc_notlazy.is_lazy)" "False" - gdb_test "print argc" " = 1" "sanity check argc" + gdb_test "print argc" " = $argc_value" "sanity check argc" gdb_test "python print (argc_lazy.is_lazy)" "\r\nTrue" - gdb_test_no_output "set argc=2" - gdb_test "python print (argc_notlazy)" "\r\n1" - gdb_test "python print (argc_lazy)" "\r\n2" + gdb_test_no_output "set argc=[expr $argc_value + 1]" "change argc" + gdb_test "python print (argc_notlazy)" "\r\n$argc_value" + gdb_test "python print (argc_lazy)" "\r\n[expr $argc_value + 1]" gdb_test "python print (argc_lazy.is_lazy)" "False" # Test string fetches, both partial and whole. |