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.
On Mon Jan 19 2015 at 8:53:22 PM Jason Molenda <[email protected]> wrote: > Should add -- when stopped here, > > > (lldb) p pathname > (const char *) $6 = 0x00007fb75946b890 "~jmolenda/lldb/simplebt.py" > (lldb) p normalized > (llvm::SmallString<64>) $5 = { > llvm::SmallVector<char, 64> = { > llvm::SmallVectorImpl<char> = { > llvm::SmallVectorTemplateBase<char, true> = { > llvm::SmallVectorTemplateCommon<char> = { > llvm::SmallVectorBase = (BeginX = 0x00007fff57d85ee8, EndX = > 0x00007fff57d85f02, CapacityX = 0x00007fff57d85f28) > > (lldb) mem r 0x00007fff57d85ee8 0x00007fff57d85f02+1 > 0x7fff57d85ee8: 7e 6a 6d 6f 6c 65 6e 64 61 2f 6c 6c 64 62 2f 73 > ~jmolenda/lldb/s > 0x7fff57d85ef8: 69 6d 70 6c 65 62 74 2e 70 79 1b > implebt.py. > > It looks like I'm getting a 0x1b instead of a \0 here. > > > > On Jan 19, 2015, at 8:51 PM, Jason Molenda <[email protected]> wrote: > > > > I'm open to the idea that I'm fixing the wrong problem. This came from > FielSpec::SetFile - > > > > void > > FileSpec::SetFile (const char *pathname, bool resolve, PathSyntax syntax) > > { > > m_filename.Clear(); > > m_directory.Clear(); > > m_is_resolved = false; > > m_syntax = (syntax == ePathSyntaxHostNative) ? > > FileSystem::GetNativePathSyntax() > : syntax; > > > > if (pathname == NULL || pathname[0] == '\0') > > return; > > > > llvm::SmallString<64> normalized(pathname); > > > > if (resolve) > > { > > FileSpec::Resolve (normalized); > > m_is_resolved = true; > > } > > > > I'm guessing SmallString doesn't store the terminal nul char in its > buffer. > > > > > >> On Jan 19, 2015, at 8:27 PM, Zachary Turner <[email protected]> wrote: > >> > >> 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. > >> > >> On Mon Jan 19 2015 at 8:25:17 PM Jason Molenda <[email protected]> > wrote: > >> Author: jmolenda > >> Date: Mon Jan 19 22:20:42 2015 > >> New Revision: 226544 > >> > >> URL: http://llvm.org/viewvc/llvm-project?rev=226544&view=rev > >> Log: > >> Fix creation of StringRef in FileSpec::ResolveUsername() > >> so it doesn't assume that the SmallVector<char> will have > >> nul terminator. It did not in at least one case. > >> Caught by ASAN instrumentation. > >> > >> 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=226544&r1=226543&r2=226544&view=diff > >> ============================================================ > ================== > >> --- lldb/trunk/source/Host/common/FileSpec.cpp (original) > >> +++ lldb/trunk/source/Host/common/FileSpec.cpp Mon Jan 19 22:20:42 2015 > >> @@ -65,7 +65,7 @@ FileSpec::ResolveUsername (llvm::SmallVe > >> if (path.empty() || path[0] != '~') > >> return; > >> > >> - llvm::StringRef path_str(path.data()); > >> + llvm::StringRef path_str(path.data(), path.size()); > >> size_t slash_pos = path_str.find_first_of("/", 1); > >> if (slash_pos == 1 || path.size() == 1) > >> { > >> > >> > >> _______________________________________________ > >> lldb-commits mailing list > >> [email protected] > >> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits > > > >
_______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
