diff options
author | Tom Tromey <tom@tromey.com> | 2017-08-03 16:53:22 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-08-22 09:30:12 -0600 |
commit | 14278e1fdbe045df184d6dd546ff6a1e9e3c3797 (patch) | |
tree | 9d736376600a484749b60ce7fe0902ae52650d68 /gdb/utils.c | |
parent | 4971c9a74b47103582834e46d0185390379e60b3 (diff) | |
download | gdb-14278e1fdbe045df184d6dd546ff6a1e9e3c3797.zip gdb-14278e1fdbe045df184d6dd546ff6a1e9e3c3797.tar.gz gdb-14278e1fdbe045df184d6dd546ff6a1e9e3c3797.tar.bz2 |
Change gdb_realpath to return a unique_xmalloc_ptr
This changes gdb_realpath to return a unique_xmalloc_ptr and fixes up
the callers. This allows removing some cleanups. This change by
itself caused xfullpath.exp to fail; and attempting to fix that ran
into various problems (like .get() being optimized out); so this patch
also rewrites xfullpath.exp to be a C++ selftest instead.
ChangeLog
2017-08-22 Tom Tromey <tom@tromey.com>
* exec.c (exec_file_attach): Update.
* linux-thread-db.c (try_thread_db_load): Update.
* guile/scm-safe-call.c (gdbscm_safe_source_script): Update.
* utils.c (gdb_realpath): Change return type.
(gdb_realpath_keepfile): Update.
(gdb_realpath_check_trailer, gdb_realpath_tests): New functions.
(_initialize_utils): Register the new self test.
* source.c (openp): Update.
(find_and_open_source): Update.
* nto-tdep.c (nto_find_and_open_solib): Update.
* main.c (set_gdb_data_directory): Update.
(captured_main_1): Update.
* dwarf2read.c (dwarf2_get_dwz_file): Update
(dw2_map_symbol_filenames): Update.
* auto-load.c (auto_load_safe_path_vec_update): Update.
(filename_is_in_auto_load_safe_path_vec): Change type of
"filename_realp".
(auto_load_objfile_script): Update.
(file_is_auto_load_safe): Update. Use std::string.
* utils.h (gdb_realpath): Return a gdb::unique_xmalloc_ptr.
testsuite/ChangeLog
2017-08-22 Tom Tromey <tom@tromey.com>
* gdb.gdb/xfullpath.exp: Remove.
Diffstat (limited to 'gdb/utils.c')
-rw-r--r-- | gdb/utils.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/gdb/utils.c b/gdb/utils.c index 5bdc638..3ca29b7 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -66,6 +66,7 @@ #include "interps.h" #include "gdb_regex.h" #include "job-control.h" +#include "common/selftest.h" #if !HAVE_DECL_MALLOC extern PTR malloc (); /* ARI: PTR */ @@ -2662,7 +2663,7 @@ string_to_core_addr (const char *my_string) return addr; } -char * +gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *filename) { /* On most hosts, we rely on canonicalize_file_name to compute @@ -2698,21 +2699,57 @@ gdb_realpath (const char *filename) we might not be able to display the original casing in a given path. */ if (len > 0 && len < MAX_PATH) - return xstrdup (buf); + return gdb::unique_xmalloc_ptr<char> (xstrdup (buf)); } #else { char *rp = canonicalize_file_name (filename); if (rp != NULL) - return rp; + return gdb::unique_xmalloc_ptr<char> (rp); } #endif /* This system is a lost cause, just dup the buffer. */ - return xstrdup (filename); + return gdb::unique_xmalloc_ptr<char> (xstrdup (filename)); } +#if GDB_SELF_TEST + +static void +gdb_realpath_check_trailer (const char *input, const char *trailer) +{ + gdb::unique_xmalloc_ptr<char> result = gdb_realpath (input); + + size_t len = strlen (result.get ()); + size_t trail_len = strlen (trailer); + + SELF_CHECK (len >= trail_len + && strcmp (result.get () + len - trail_len, trailer) == 0); +} + +static void +gdb_realpath_tests () +{ + /* A file which contains a directory prefix. */ + gdb_realpath_check_trailer ("./xfullpath.exp", "/xfullpath.exp"); + /* A file which contains a directory prefix. */ + gdb_realpath_check_trailer ("../../defs.h", "/defs.h"); + /* A one-character filename. */ + gdb_realpath_check_trailer ("./a", "/a"); + /* A file in the root directory. */ + gdb_realpath_check_trailer ("/root_file_which_should_exist", + "/root_file_which_should_exist"); + /* A file which does not have a directory prefix. */ + gdb_realpath_check_trailer ("xfullpath.exp", "xfullpath.exp"); + /* A one-char filename without any directory prefix. */ + gdb_realpath_check_trailer ("a", "a"); + /* An empty filename. */ + gdb_realpath_check_trailer ("", ""); +} + +#endif /* GDB_SELF_TEST */ + /* Return a copy of FILENAME, with its directory prefix canonicalized by gdb_realpath. */ @@ -2721,7 +2758,6 @@ gdb_realpath_keepfile (const char *filename) { const char *base_name = lbasename (filename); char *dir_name; - char *real_path; char *result; /* Extract the basename of filename, and return immediately @@ -2749,13 +2785,13 @@ gdb_realpath_keepfile (const char *filename) /* Canonicalize the directory prefix, and build the resulting filename. If the dirname realpath already contains an ending directory separator, avoid doubling it. */ - real_path = gdb_realpath (dir_name); + gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name); + const char *real_path = path_storage.get (); if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1])) result = concat (real_path, base_name, (char *) NULL); else result = concat (real_path, SLASH_STRING, base_name, (char *) NULL); - xfree (real_path); return gdb::unique_xmalloc_ptr<char> (result); } @@ -3283,4 +3319,8 @@ _initialize_utils (void) add_internal_problem_command (&internal_error_problem); add_internal_problem_command (&internal_warning_problem); add_internal_problem_command (&demangler_warning_problem); + +#if GDB_SELF_TEST + selftests::register_test (gdb_realpath_tests); +#endif } |