2019-05-08 Tom Tromey <tromey@adacore.com>
+ * c-lang.c (c_get_string): Handle non-C-style arrays.
+
+2019-05-08 Tom Tromey <tromey@adacore.com>
+
* typeprint.c (print_offset_data::update): Print the bit offset,
not the number of bits remaining.
/* If the string lives in GDB's memory instead of the inferior's,
then we just need to copy it to BUFFER. Also, since such strings
are arrays with known size, FETCHLIMIT will hold the size of the
- array. */
+ array.
+
+ An array is assumed to live in GDB's memory, so we take this path
+ here.
+
+ However, it's possible for the caller to request more array
+ elements than apparently exist -- this can happen when using the
+ C struct hack. So, only do this if either no length was
+ specified, or the length is within the existing bounds. This
+ avoids running off the end of the value's contents. */
if ((VALUE_LVAL (value) == not_lval
- || VALUE_LVAL (value) == lval_internalvar)
- && fetchlimit != UINT_MAX)
+ || VALUE_LVAL (value) == lval_internalvar
+ || TYPE_CODE (type) == TYPE_CODE_ARRAY)
+ && fetchlimit != UINT_MAX
+ && (*length < 0 || *length <= fetchlimit))
{
int i;
const gdb_byte *contents = value_contents (value);
}
else
{
- CORE_ADDR addr = value_as_address (value);
+ /* value_as_address does not return an address for an array when
+ c_style_arrays is false, so we handle that specially
+ here. */
+ CORE_ADDR addr;
+ if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
+ {
+ if (VALUE_LVAL (value) != lval_memory)
+ error (_("Attempt to take address of value "
+ "not located in memory."));
+ addr = value_address (value);
+ }
+ else
+ addr = value_as_address (value);
/* Prior to the fix for PR 16196 read_string would ignore fetchlimit
if length > 0. The old "broken" behaviour is the behaviour we want:
gdb_test "python print (\"---\"+st.string (length = 0)+\"---\")" "------" "test string (length = 0) is empty"
gdb_test "python print (len(st.string (length = 0)))" "0" "test length is 0"
+ # We choose Ada here to test a language where c_style_arrays is
+ # false.
+ gdb_test "set lang ada" \
+ "Warning: the current language does not match this frame."
+ gdb_test "python print (st.string ())" "divide et impera" \
+ "Test string with no length in ada"
+ gdb_test_no_output "set lang auto"
# Fetch a string that has embedded nulls.
gdb_test "print nullst" "\"divide\\\\000et\\\\000impera\".*"
gdb_py_test_silent_cmd "python xstr = gdb.parse_and_eval('xstr')" "get xstr" 1
gdb_test "python print(xstr\['text'\].string (length = xstr\['length'\]))" "x{100}" \
"read string beyond declared size"
+
+ # However it shouldn't be possible to fetch past the end of a
+ # non-memory value.
+ gdb_py_test_silent_cmd "python str = '\"str\"'" "set up str variable" 1
+ gdb_test "python print (gdb.parse_and_eval (str).string (length = 10))" \
+ "gdb.error: Attempt to take address of value not located in memory.\r\nError while executing Python code."
}
proc test_inferior_function_call {} {