[Lldb-commits] [lldb] r209917 - Don't use libc's "char *basename(char *)" or "char *dirname(char *)" as they are not thread safe.

Greg Clayton gclayton at apple.com
Fri May 30 14:06:57 PDT 2014


Author: gclayton
Date: Fri May 30 16:06:57 2014
New Revision: 209917

URL: http://llvm.org/viewvc/llvm-project?rev=209917&view=rev
Log:
Don't use libc's "char *basename(char *)" or "char *dirname(char *)" as they are not thread safe.

I switched the lldb_private::FileSpec code over to use "llvm::StringRef llvm::sys::path::filename(llvm::StringRef)" for basename() and "llvm::StringRef llvm::sys::path::parent_path(llvm::StringRef)" for dirname().

<rdar://problem/16870083>

Modified:
    lldb/trunk/source/Host/common/FileSpec.cpp

Modified: lldb/trunk/source/Host/common/FileSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=209917&r1=209916&r2=209917&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/FileSpec.cpp (original)
+++ lldb/trunk/source/Host/common/FileSpec.cpp Fri May 30 16:06:57 2014
@@ -324,40 +324,14 @@ FileSpec::SetFile (const char *pathname,
     
     if (path_fit)
     {
-        char *filename = ::basename (resolved_path);
-        if (filename)
+        llvm::StringRef resolve_path_ref(resolved_path);
+        llvm::StringRef filename_ref = llvm::sys::path::filename(resolve_path_ref);
+        if (!filename_ref.empty())
         {
-            m_filename.SetCString (filename);
-            // Truncate the basename off the end of the resolved path
-
-            // Only attempt to get the dirname if it looks like we have a path
-            if (strchr(resolved_path, '/')
-#ifdef _WIN32
-                || strchr(resolved_path, '\\')
-#endif
-                )
-            {
-                char *directory = ::dirname (resolved_path);
-
-                // Make sure we didn't get our directory resolved to "." without having
-                // specified
-                if (directory)
-                    m_directory.SetCString(directory);
-                else
-                {
-                    char *last_resolved_path_slash = strrchr(resolved_path, '/');
-#ifdef _WIN32
-                    char* last_resolved_path_slash_windows = strrchr(resolved_path, '\\');
-                    if (last_resolved_path_slash_windows > last_resolved_path_slash)
-                        last_resolved_path_slash = last_resolved_path_slash_windows;
-#endif
-                    if (last_resolved_path_slash)
-                    {
-                        *last_resolved_path_slash = '\0';
-                        m_directory.SetCString(resolved_path);
-                    }
-                }
-            }
+            m_filename.SetString (filename_ref);
+            llvm::StringRef directory_ref = llvm::sys::path::parent_path(resolve_path_ref);
+            if (!directory_ref.empty())
+                m_directory.SetString(directory_ref);
         }
         else
             m_directory.SetCString(resolved_path);
@@ -572,8 +546,7 @@ FileSpec::ResolveExecutableLocation ()
             const std::string file_str (file_cstr);
             std::string path = llvm::sys::FindProgramByName (file_str);
             llvm::StringRef dir_ref = llvm::sys::path::parent_path(path);
-            //llvm::StringRef dir_ref = path.getDirname();
-            if (! dir_ref.empty())
+            if (!dir_ref.empty())
             {
                 // FindProgramByName returns "." if it can't find the file.
                 if (strcmp (".", dir_ref.data()) == 0)





More information about the lldb-commits mailing list