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;
 }
 
 


_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to