aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2018-11-07 16:03:38 -0500
committerJoel Brobecker <brobecker@adacore.com>2018-11-07 16:28:07 -0500
commit07deea26b5c3dfefe50dff74925e903b826acf22 (patch)
tree342e6e6267237f6030286d5ce035ff0a3706c8aa
parentd3def5d73eb9d8295ca7b11d130b17a815151951 (diff)
downloadgdb-07deea26b5c3dfefe50dff74925e903b826acf22.zip
gdb-07deea26b5c3dfefe50dff74925e903b826acf22.tar.gz
gdb-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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-tasks.c16
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.