[Lldb-commits] [lldb] r228867 - Fixed SBModule::GetUUIDString() to not use a static character buffer.

Greg Clayton gclayton at apple.com
Wed Feb 11 11:16:39 PST 2015


Author: gclayton
Date: Wed Feb 11 13:16:38 2015
New Revision: 228867

URL: http://llvm.org/viewvc/llvm-project?rev=228867&view=rev
Log:
Fixed SBModule::GetUUIDString() to not use a static character buffer.

Rules for returning "const char *" from functions in the public lldb::SB* API are that you must constify the string using "ConstString(cstr).GetCString()" and return that. This puts the string into a string pool that never goes away. This is only when there is nothing that can hold onto the string. It is OK to specify that a string value lives as long as its SB class counterpart, but this should be made clear in the API if this is done. Many classes already constify their strings (symbol mangled and demangled names, variable names, type names, etc), so be sure to verify you string isn't already constified before you re-constify it. It won't do any harm to re-constify it, it will just cause you a little performance by having to rehash the string.


Modified:
    lldb/trunk/source/API/SBModule.cpp

Modified: lldb/trunk/source/API/SBModule.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBModule.cpp?rev=228867&r1=228866&r2=228867&view=diff
==============================================================================
--- lldb/trunk/source/API/SBModule.cpp (original)
+++ lldb/trunk/source/API/SBModule.cpp Wed Feb 11 13:16:38 2015
@@ -211,34 +211,28 @@ SBModule::GetUUIDString () const
 {
     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
 
-    static char uuid_string_buffer[80];
-    const char *uuid_c_string = NULL;
-    std::string uuid_string;
+    const char *uuid_cstr = NULL;
     ModuleSP module_sp (GetSP ());
     if (module_sp)
-        uuid_string = module_sp->GetUUID().GetAsString();
-
-    if (!uuid_string.empty())
     {
-        strncpy (uuid_string_buffer, uuid_string.c_str(), sizeof (uuid_string_buffer));
-        uuid_string_buffer[sizeof (uuid_string_buffer) - 1] = '\0';
-        uuid_c_string = uuid_string_buffer;
+        // We are going to return a "const char *" value through the public
+        // API, so we need to constify it so it gets added permanently the the
+        // string pool and then we don't need to worry about the lifetime of the
+        // string as it will never go away once it has been put into the ConstString
+        // string pool
+        uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
     }
 
-    if (log)
+    if (uuid_cstr && uuid_cstr[0])
     {
-        if (!uuid_string.empty())
-        {
-            StreamString s;
-            module_sp->GetUUID().Dump (&s);
-            log->Printf ("SBModule(%p)::GetUUIDString () => %s",
-                         static_cast<void*>(module_sp.get()), s.GetData());
-        }
-        else
-            log->Printf ("SBModule(%p)::GetUUIDString () => NULL",
-                         static_cast<void*>(module_sp.get()));
+        if (log)
+            log->Printf ("SBModule(%p)::GetUUIDString () => %s", static_cast<void*>(module_sp.get()), uuid_cstr);
+        return uuid_cstr;
     }
-    return uuid_c_string;
+
+    if (log)
+        log->Printf ("SBModule(%p)::GetUUIDString () => NULL", static_cast<void*>(module_sp.get()));
+    return NULL;
 }
 
 





More information about the lldb-commits mailing list