This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
FYI: more cleanup fixes
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 30 Jun 2011 12:47:03 -0600
- Subject: FYI: more cleanup fixes
I am checking this in on the trunk.
I've updated the GCC plugin a little and it caught a few more obviously
incorrect uses of cleanups.
Built and regtested by the buildbot.
There are still a number of failures where the fix was not as obvious:
../../archer/gdb/remote-mips.c: In function âmips_initializeâ:
../../archer/gdb/remote-mips.c:1419:7: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/remote-mips.c: In function âmips_exit_debugâ:
../../archer/gdb/remote-mips.c:1400:1: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/remote-mips.c: In function âcommon_openâ:
../../archer/gdb/remote-mips.c:1659:1: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/linux-nat.c: In function âlinux_nat_info_proc_cmdâ:
../../archer/gdb/linux-nat.c:4887:1: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/linux-nat.c: In function âlinux_child_pid_to_exec_fileâ:
../../archer/gdb/linux-nat.c:4197:1: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/linux-nat.c: In function âlinux_nat_make_corefile_notesâ:
../../archer/gdb/linux-nat.c:4601:3: error: cleanup stack is not empty at return [-fpermissive]
The linux_child_pid_to_exec_file one is interesting -- nearly all of the
existing pid_to_exec_file methods return malloc'd memory, despite the
spec in target.h. Perhaps we should change the spec, I think only the
Windows variant would need a minor tweak.
../../archer/gdb/breakpoint.c: In function âbreakpoint_re_set_defaultâ:
../../archer/gdb/breakpoint.c:11448:1: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/ada-lang.c: In function âada_make_symbol_completion_listâ:
../../archer/gdb/ada-lang.c:5649:5: error: cleanup stack is not empty at return [-fpermissive]
../../archer/gdb/record.c: In function ârecord_wait_1â:
../../archer/gdb/record.c:1466:1: error: cleanup stack is not empty at return [-fpermissive]
This one seem particularly bad -- lots of return paths without running
cleanups.
Tom
2011-06-30 Tom Tromey <tromey@redhat.com>
* symfile-mem.c (symbol_file_add_from_memory): Call do_cleanups.
* solib-svr4.c (open_symbol_file_object): Call do_cleanups on all
return paths. Defer final do_cleanups until last return.
* arm-tdep.c (arm_exidx_new_objfile): Make null cleanup after
early return.
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 433ce21..1a75af1 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -2211,7 +2211,7 @@ arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
static void
arm_exidx_new_objfile (struct objfile *objfile)
{
- struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
+ struct cleanup *cleanups;
struct arm_exidx_data *data;
asection *exidx, *extab;
bfd_vma exidx_vma = 0, extab_vma = 0;
@@ -2222,6 +2222,7 @@ arm_exidx_new_objfile (struct objfile *objfile)
/* If we've already touched this file, do nothing. */
if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
return;
+ cleanups = make_cleanup (null_cleanup, NULL);
/* Read contents of exception table and index. */
exidx = bfd_get_section_by_name (objfile->obfd, ".ARM.exidx");
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index f668f83..d92a83c 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1021,17 +1021,26 @@ open_symbol_file_object (void *from_ttyp)
if (symfile_objfile)
if (!query (_("Attempt to reload symbols from process? ")))
- return 0;
+ {
+ do_cleanups (cleanups);
+ return 0;
+ }
/* Always locate the debug struct, in case it has moved. */
info->debug_base = 0;
if (locate_base (info) == 0)
- return 0; /* failed somehow... */
+ {
+ do_cleanups (cleanups);
+ return 0; /* failed somehow... */
+ }
/* First link map member should be the executable. */
lm = solib_svr4_r_map (info);
if (lm == 0)
- return 0; /* failed somehow... */
+ {
+ do_cleanups (cleanups);
+ return 0; /* failed somehow... */
+ }
/* Read address of name from target memory to GDB. */
read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size);
@@ -1039,11 +1048,11 @@ open_symbol_file_object (void *from_ttyp)
/* Convert the address to host format. */
l_name = extract_typed_address (l_name_buf, ptr_type);
- /* Free l_name_buf. */
- do_cleanups (cleanups);
-
if (l_name == 0)
- return 0; /* No filename. */
+ {
+ do_cleanups (cleanups);
+ return 0; /* No filename. */
+ }
/* Now fetch the filename from target memory. */
target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
@@ -1053,12 +1062,14 @@ open_symbol_file_object (void *from_ttyp)
{
warning (_("failed to read exec filename from attached file: %s"),
safe_strerror (errcode));
+ do_cleanups (cleanups);
return 0;
}
/* Have a pathname: read the symbol file. */
symbol_file_add_main (filename, from_tty);
+ do_cleanups (cleanups);
return 1;
}
diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
index 6da5a1c..bef28c7 100644
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -72,6 +72,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
bfd_vma loadbase;
struct section_addr_info *sai;
unsigned int i;
+ struct cleanup *cleanup;
if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
error (_("add-symbol-file-from-memory not supported for this target"));
@@ -97,7 +98,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
}
sai = alloc_section_addr_info (bfd_count_sections (nbfd));
- make_cleanup (xfree, sai);
+ cleanup = make_cleanup (xfree, sai);
i = 0;
for (sec = nbfd->sections; sec != NULL; sec = sec->next)
if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
@@ -114,6 +115,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
/* This might change our ideas about frames already looked at. */
reinit_frame_cache ();
+ do_cleanups (cleanup);
return objf;
}