[LLVMdev] Little question about Stringref

Joshua Cranmer 🐧 Pidgeot18 at gmail.com
Tue Apr 22 10:20:20 PDT 2014


On 4/22/2014 11:55 AM, Hanbing Li wrote:
> Hi,
>
> I tried to get the name of function+loop, so I write a small function 
> as following:
>
> StringRef getStringofFL(const Function * F, const Loop * L){
> StringRef sr;
> std::string s1 = F->getName();
> std::string s2 = L->getHeader()->getName();
> sr = s1+s2;
> return sr;
> }
>
>
> However, two questions came:
>
> 1, if I output sr like: errs() << sr; it's ok (for instance: 
> mainfor.cond), but when I called this function and got the 
> StringRef: StringRef s= getStringofFL(F, L); errs() << s; the result 
> is: m\275[\377\177\000\0002\354\333\004\001,why?
>

StringRef is basically a wrapper around a (non-owning) const char* and 
size_t length. The memory pointed to be s1 + s2 is a temporary 
std::string that is deleted by the end of the statement, giving you a 
dangling pointer. (That errs() << sr; worked is an accident).

-- 
Joshua Cranmer
Thunderbird and DXR developer
Source code archæologist

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140422/fe837ee7/attachment.html>


More information about the llvm-dev mailing list