old-cross-binutils/gdb/testsuite/gdb.ada
Joel Brobecker c1b5a1a6e7 Internal error trying to print uninitialized string.
Trying to print the value of a string whose size is not known at
compile-time before it gets assigned a value can lead to the following
internal error:

    (gdb) p my_str
    $1 =
    /[...]/utils.c:1089: internal-error: virtual memory exhausted.

What happens is that my_str is described as a reference to an array
type whose bounds are dynamic. During the read of that variable's
value (in default_read_var_value), we end up resolving dynamic types
which, for reference types, makes us also resolve the target of that
reference type. This means we resolve our variable to a reference
to an array whose bounds are undefined, and unfortunately very far
appart.

So, when we pass that value to ada-valprint, and in particular to
da_val_print_ref, we eventually try to allocate too large of a buffer
corresponding to the (bogus) size of our array, hence the internal
error.

This patch fixes the problem by adding a size_check before trying
to print the dereferenced value. To perform this check, a function
that was previously specific to ada-lang.c (check_size) gets
exported, and renamed to something less prone to name collisions
(ada_ensure_varsize_limit).

gdb/ChangeLog:

        * ada-lang.h (ada_ensure_varsize_limit): Declare.
        * ada-lang.c (check_size): Remove advance declaration.
        (ada_ensure_varsize_limit): Renames check_size.
        Replace calls to check_size by calls to ada_ensure_varsize_limit
        throughout.
        * ada-valprint.c (ada_val_print_ref): Add call to
        ada_ensure_varsize_limit.  Add comment explaining why.

gdb/testsuite/ChangeLog:

        * gdb.ada/str_uninit: New testcase.
2014-12-13 11:00:24 -05:00
..
addr_arith
aliased_array
arr_arr
array_bounds
array_char_idx
array_return
array_subscript_addr
arraydim
arrayidx
arrayparam
arrayptr
atomic_enum
bad-task-bp-keyword
bp_enum_homonym
bp_on_var
bp_range_type
bp_reset
call_pn
catch_ex
char_enum
char_param
complete
cond_lang
dot_all
dyn_arrayidx
dyn_loc
enum_idx_packed
exec_changed
expr_delims
exprs
fixed_cmp
fixed_points
float_param
formatted_ref
frame_args
fullname_bp
fun_addr
fun_in_declare
funcall_param
homonym
info_exc
info_locals_renaming
int_deref
interface
iwide
lang_switch
mi_catch_ex
mi_dyn_arr
mi_ex_cond
mi_exc_info
mi_interface
mi_task_arg
mi_task_info
mod_from_name
n_arr_bound
nested
null_array
null_record
O2_float_param
operator_bp
optim_drec
packed_array
packed_tagged
pckd_arr_ren
pkd_arr_elem
pp-rec-component
print_chars
ptr_typedef
ptype_field
ptype_tagged_param
py_range
rdv_wait
rec_return
ref_param
ref_tick_size
same_enum
set_pckd_arr_elt
set_wstr
small_reg_param
start
str_ref_cmp
str_uninit
sym_print_name
taft_type
tagged
tagged_access
tagged_not_init
task_bp
tasks
tick_last_segv
tick_length_array_enum_idx
type_coercion
unc_arr_ptr_in_var_rec
uninitialized_vars
variant_record_packed_array
watch_arg
whatis_array_val
widewide
win_fu_syms
addr_arith.exp
aliased_array.exp
arr_arr.exp
array_bounds.exp
array_char_idx.exp
array_return.exp
array_subscript_addr.exp
arraydim.exp
arrayidx.exp
arrayparam.exp
arrayptr.exp
assign_1.exp
atomic_enum.exp
bad-task-bp-keyword.exp
boolean_expr.exp
bp_enum_homonym.exp
bp_on_var.exp
bp_range_type.exp
bp_reset.exp
call_pn.exp
catch_ex.exp
char_enum.exp
char_param.exp
complete.exp
cond_lang.exp
dot_all.exp
dyn_arrayidx.exp
dyn_loc.exp
enum_idx_packed.exp
exec_changed.exp
expr_delims.exp
exprs.exp
fixed_cmp.exp
fixed_points.exp
float_param.exp
formatted_ref.exp
frame_args.exp
fullname_bp.exp
fun_addr.exp
fun_in_declare.exp
funcall_param.exp
gnat_ada.gpr
homonym.exp
info_exc.exp
info_locals_renaming.exp
info_types.c
info_types.exp
int_deref.exp
interface.exp
iwide.exp
lang_switch.exp
Makefile.in
mi_catch_ex.exp
mi_dyn_arr.exp
mi_ex_cond.exp
mi_exc_info.exp
mi_interface.exp
mi_task_arg.exp
mi_task_info.exp
mod_from_name.exp
n_arr_bound.exp
nested.exp
null_array.exp
null_record.exp
O2_float_param.exp
operator_bp.exp
optim_drec.exp
packed_array.exp
packed_tagged.exp
pckd_arr_ren.exp
pkd_arr_elem.exp
pp-rec-component.exp
pp-rec-component.py
print_chars.exp
print_pc.exp
ptr_typedef.exp
ptype_arith_binop.exp
ptype_field.exp
ptype_tagged_param.exp
py_range.exp
rdv_wait.exp
rec_return.exp
ref_param.exp
ref_tick_size.exp
same_enum.exp
set_pckd_arr_elt.exp
set_wstr.exp
small_reg_param.exp
start.exp
str_ref_cmp.exp
str_uninit.exp
sym_print_name.exp
taft_type.exp
tagged.exp
tagged_access.exp
tagged_not_init.exp
task_bp.exp
tasks.exp
tick_last_segv.exp
tick_length_array_enum_idx.exp
type_coercion.exp
unc_arr_ptr_in_var_rec.exp
uninitialized_vars.exp
variant_record_packed_array.exp
watch_arg.exp
whatis_array_val.exp
widewide.exp
win_fu_syms.exp