It's a bit of an awkward interface.  It doesn't necessarily store a null terminator by default.  If you call SmallString<>::c_str(), it will append a null terminator (if necessary), but the base class, SmallVector<> doesn't have a c_str() method, only a data() method, which doesn't append the null terminator.  I should probably ask someone what the canonical way to do this is, but in the meantime it looks like your fix is probably correct.<br><br><div class="gmail_quote">On Mon Jan 19 2015 at 8:53:22 PM Jason Molenda <<a href="mailto:jmolenda@apple.com">jmolenda@apple.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Should add -- when stopped here,<br>
<br>
<br>
(lldb) p pathname<br>
(const char *) $6 = 0x00007fb75946b890 "~jmolenda/lldb/simplebt.py"<br>
(lldb) p normalized<br>
(llvm::SmallString<64>) $5 = {<br>
  llvm::SmallVector<char, 64> = {<br>
    llvm::SmallVectorImpl<char> = {<br>
      llvm::SmallVectorTemplateBase<<u></u>char, true> = {<br>
        llvm::<u></u>SmallVectorTemplateCommon<<u></u>char> = {<br>
          llvm::SmallVectorBase = (BeginX = 0x00007fff57d85ee8, EndX = 0x00007fff57d85f02, CapacityX = 0x00007fff57d85f28)<br>
<br>
(lldb)  mem r 0x00007fff57d85ee8 0x00007fff57d85f02+1<br>
0x7fff57d85ee8: 7e 6a 6d 6f 6c 65 6e 64 61 2f 6c 6c 64 62 2f 73  ~jmolenda/lldb/s<br>
0x7fff57d85ef8: 69 6d 70 6c 65 62 74 2e 70 79 1b                 implebt.py.<br>
<br>
It looks like I'm getting a 0x1b instead of a \0 here.<br>
<br>
<br>
> On Jan 19, 2015, at 8:51 PM, Jason Molenda <<a href="mailto:jmolenda@apple.com" target="_blank">jmolenda@apple.com</a>> wrote:<br>
><br>
> I'm open to the idea that I'm fixing the wrong problem.  This came from FielSpec::SetFile -<br>
><br>
> void<br>
> FileSpec::SetFile (const char *pathname, bool resolve, PathSyntax syntax)<br>
> {<br>
>    m_filename.Clear();<br>
>    m_directory.Clear();<br>
>    m_is_resolved = false;<br>
>    m_syntax = (syntax == ePathSyntaxHostNative) ? FileSystem::<u></u>GetNativePathSyntax() : syntax;<br>
><br>
>    if (pathname == NULL || pathname[0] == '\0')<br>
>        return;<br>
><br>
>    llvm::SmallString<64> normalized(pathname);<br>
><br>
>    if (resolve)<br>
>    {<br>
>        FileSpec::Resolve (normalized);<br>
>        m_is_resolved = true;<br>
>    }<br>
><br>
> I'm guessing SmallString doesn't store the terminal nul char in its buffer.<br>
><br>
><br>
>> On Jan 19, 2015, at 8:27 PM, Zachary Turner <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>> wrote:<br>
>><br>
>> While it's true that SmallString, and hence SmallVector support non null-terminated strings, it worries me if we have a non null-terminated string somewhere in LLDB.<br>
>><br>
>> On Mon Jan 19 2015 at 8:25:17 PM Jason Molenda <<a href="mailto:jmolenda@apple.com" target="_blank">jmolenda@apple.com</a>> wrote:<br>
>> Author: jmolenda<br>
>> Date: Mon Jan 19 22:20:42 2015<br>
>> New Revision: 226544<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=226544&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=226544&view=rev</a><br>
>> Log:<br>
>> Fix creation of StringRef in FileSpec::ResolveUsername()<br>
>> so it doesn't assume that the SmallVector<char> will have<br>
>> nul terminator.  It did not in at least one case.<br>
>> Caught by ASAN instrumentation.<br>
>><br>
>> Modified:<br>
>>    lldb/trunk/source/Host/common/<u></u>FileSpec.cpp<br>
>><br>
>> Modified: lldb/trunk/source/Host/common/<u></u>FileSpec.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=226544&r1=226543&r2=226544&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lldb/trunk/source/<u></u>Host/common/FileSpec.cpp?rev=<u></u>226544&r1=226543&r2=226544&<u></u>view=diff</a><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- lldb/trunk/source/Host/common/<u></u>FileSpec.cpp (original)<br>
>> +++ lldb/trunk/source/Host/common/<u></u>FileSpec.cpp Mon Jan 19 22:20:42 2015<br>
>> @@ -65,7 +65,7 @@ FileSpec::ResolveUsername (llvm::SmallVe<br>
>>     if (path.empty() || path[0] != '~')<br>
>>         return;<br>
>><br>
>> -    llvm::StringRef path_str(path.data());<br>
>> +    llvm::StringRef path_str(path.data(), path.size());<br>
>>     size_t slash_pos = path_str.find_first_of("/", 1);<br>
>>     if (slash_pos == 1 || path.size() == 1)<br>
>>     {<br>
>><br>
>><br>
>> ______________________________<u></u>_________________<br>
>> lldb-commits mailing list<br>
>> <a href="mailto:lldb-commits@cs.uiuc.edu" target="_blank">lldb-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/lldb-commits</a><br>
><br>
<br>
</blockquote></div>