gdb/ada-lang.c: one malloc -> unique_ptr<[]>

Switching gdb to use gnulib's C++ namespace mode reveals we're calling
malloc instead of xmalloc here:

 ..../src/gdb/ada-lang.c: In function ‘value* ada_value_primitive_packed_val(value*, const gdb_byte*, long int, int, int, type*)’:
 ..../src/gdb/ada-lang.c:2592:50: error: call to ‘malloc’ declared with attribute warning: The symbol ::malloc refers to the system function. Use gnulib::malloc instead. [-Werror]
	staging = (gdb_byte *) malloc (staging_len);
						   ^

We're unconditionaly using the result afterwards -- so it's not a case
of gracefully handling huge allocations.

Since we want to get rid of all cleanups, fix this by switching to
new[] and unique_ptr<[]> instead, while at it.

Regtested on Fedora 23.

gdb/ChangeLog:
2016-11-16  Pedro Alves  <palves@redhat.com>

	* ada-lang.c (ada_value_primitive_packed_val): Use unique_ptr and
	new gdb_byte[] instead of malloc and cleanups.
This commit is contained in:
Pedro Alves 2016-11-16 11:38:49 +00:00
parent 19f1935d91
commit 200069c74f
2 changed files with 10 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2016-11-16 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_value_primitive_packed_val): Use unique_ptr and
new gdb_byte[] instead of malloc and cleanups.
2016-11-17 Pedro Alves <palves@redhat.com> 2016-11-17 Pedro Alves <palves@redhat.com>
* tracepoint.c (collection_list::add_memrange): Add gdbarch * tracepoint.c (collection_list::add_memrange): Add gdbarch

View File

@ -2568,9 +2568,8 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr,
gdb_byte *unpacked; gdb_byte *unpacked;
const int is_scalar = is_scalar_type (type); const int is_scalar = is_scalar_type (type);
const int is_big_endian = gdbarch_bits_big_endian (get_type_arch (type)); const int is_big_endian = gdbarch_bits_big_endian (get_type_arch (type));
gdb_byte *staging = NULL; std::unique_ptr<gdb_byte[]> staging;
int staging_len = 0; int staging_len = 0;
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
type = ada_check_typedef (type); type = ada_check_typedef (type);
@ -2589,14 +2588,13 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr,
we do, is unpack the data into a byte-aligned buffer, and then we do, is unpack the data into a byte-aligned buffer, and then
use that buffer as our object's value for resolving the type. */ use that buffer as our object's value for resolving the type. */
staging_len = (bit_size + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT; staging_len = (bit_size + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
staging = (gdb_byte *) malloc (staging_len); staging.reset (new gdb_byte[staging_len]);
make_cleanup (xfree, staging);
ada_unpack_from_contents (src, bit_offset, bit_size, ada_unpack_from_contents (src, bit_offset, bit_size,
staging, staging_len, staging.get (), staging_len,
is_big_endian, has_negatives (type), is_big_endian, has_negatives (type),
is_scalar); is_scalar);
type = resolve_dynamic_type (type, staging, 0); type = resolve_dynamic_type (type, staging.get (), 0);
if (TYPE_LENGTH (type) < (bit_size + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT) if (TYPE_LENGTH (type) < (bit_size + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT)
{ {
/* This happens when the length of the object is dynamic, /* This happens when the length of the object is dynamic,
@ -2656,7 +2654,6 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr,
if (bit_size == 0) if (bit_size == 0)
{ {
memset (unpacked, 0, TYPE_LENGTH (type)); memset (unpacked, 0, TYPE_LENGTH (type));
do_cleanups (old_chain);
return v; return v;
} }
@ -2665,14 +2662,13 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr,
/* Small short-cut: If we've unpacked the data into a buffer /* Small short-cut: If we've unpacked the data into a buffer
of the same size as TYPE's length, then we can reuse that, of the same size as TYPE's length, then we can reuse that,
instead of doing the unpacking again. */ instead of doing the unpacking again. */
memcpy (unpacked, staging, staging_len); memcpy (unpacked, staging.get (), staging_len);
} }
else else
ada_unpack_from_contents (src, bit_offset, bit_size, ada_unpack_from_contents (src, bit_offset, bit_size,
unpacked, TYPE_LENGTH (type), unpacked, TYPE_LENGTH (type),
is_big_endian, has_negatives (type), is_scalar); is_big_endian, has_negatives (type), is_scalar);
do_cleanups (old_chain);
return v; return v;
} }