diff options
author | Joel Brobecker <brobecker@adacore.com> | 2018-11-07 16:03:38 -0500 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2018-11-07 16:28:07 -0500 |
commit | 07deea26b5c3dfefe50dff74925e903b826acf22 (patch) | |
tree | 342e6e6267237f6030286d5ce035ff0a3706c8aa /gdb | |
parent | d3def5d73eb9d8295ca7b11d130b17a815151951 (diff) | |
download | binutils-07deea26b5c3dfefe50dff74925e903b826acf22.zip binutils-07deea26b5c3dfefe50dff74925e903b826acf22.tar.gz binutils-07deea26b5c3dfefe50dff74925e903b826acf22.tar.bz2 |
ada-tasks.c::read_atcb: start from a cleared ada_task_info result
The purpose of this patch is not to fix a bug per se, but rather
to robustify this function to make sure it never returns a struct
ada_task_info where some of the fields are left uninitialized.
Reading the current implementation, it attempts to methodically
set them all one by one: but it's not excluded that a future
change might miss something. A memset is cheap and make sure that
this function returns repeatable results.
This in turns allows us to remove some assignments which have become
redundant.
gdb/ChangeLog:
* ada-tasks.c (read_atcb): Clear task_info before computing
the value of each of its fields.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ada-tasks.c | 16 |
2 files changed, 11 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f7d1de5..c94321b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-11-07 Joel Brobecker <brobecker@adacore.com> + + * ada-tasks.c (read_atcb): Clear task_info before computing + the value of each of its fields. + 2018-11-07 Andrew Burgess <andrew.burgess@embecosm.com> * dwarf2read.c (dwarf2_init_integer_type): Check for name being diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 566eae5..5b97e93 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -611,6 +611,10 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info) const struct ada_tasks_pspace_data *pspace_data = get_ada_tasks_pspace_data (current_program_space); + /* Clear the whole structure to start with, so that everything + is always initialized the same. */ + memset (task_info, 0, sizeof (struct ada_task_info)); + if (!pspace_data->initialized_p) { const char *err_msg = ada_get_tcb_types_info (); @@ -704,9 +708,6 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info) task_info->parent = value_as_address (value_field (common_value, pspace_data->atcb_fieldno.parent)); - else - task_info->parent = 0; - /* If the ATCB contains some information about entry calls, then compute the "called_task" as well. Otherwise, zero. */ @@ -732,15 +733,10 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info) value_as_address (value_field (entry_calls_value_element, called_task_fieldno)); } - else - { - task_info->called_task = 0; - } - /* If the ATCB cotnains some information about RV callers, - then compute the "caller_task". Otherwise, zero. */ + /* If the ATCB cotnains some information about RV callers, then + compute the "caller_task". Otherwise, leave it as zero. */ - task_info->caller_task = 0; if (pspace_data->atcb_fieldno.call >= 0) { /* Get the ID of the caller task from Common_ATCB.Call.all.Self. |