Little question about Stringref

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?

2, I used the StringMap, and the StringRef got from the function getStringofFL as a key. Then I stored something into this StringMap, but I couldn’t get it with the same function and loop. why?

Thank you!

Hanbing

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).

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;

To answer your first question, the std::string created by operator+ here gets destroyed when it goes out of scope. The StringRef holds on to a pointer to the buffer that that string used to own, making this a classic use-after-free bug.

Thank you all,

It really works.

Hanbing