noajshu added inline comments.

================
Comment at: llvm/lib/Support/Caching.cpp:36
 
+  SmallString<10> CacheName = CacheNameRef;
   return [=](unsigned Task, StringRef Key) -> AddStreamFn {
----------------
tejohnson wrote:
> noajshu wrote:
> > noajshu wrote:
> > > tejohnson wrote:
> > > > Is this copy necessary? I believe sys::path::append takes a Twine and 
> > > > eventually makes a copy of it.
> > > Thanks, removed!
> > Thanks again for this suggestion. On second thought I am concerned about 
> > lifetime issues with this approach. The `localCache` function returns a 
> > lambda which captures the arguments by copy. The Twine and StringRef 
> > classes just point to some temporary memory which could be modified/freed 
> > before the returned lambda is invoked. Making a copy (or just running the 
> > `sys::path::append` before returning the lambda) would protect from such 
> > bugs.
> > 
> > Here is a stripped-down example of the issue I'm concerned about:
> > ```
> > #include <iostream>
> > #include <string.h>
> > #include "llvm/ADT/Twine.h"
> > 
> > using namespace llvm;
> > 
> > auto localCacheDummy(Twine FooTwine) {
> >     return [=] () {
> >             std::cout << FooTwine.str();
> >     };
> > }
> > 
> > int main() {
> >     std::string SpecialString = "hello here is a string\n";
> >     auto myFunction = localCacheDummy(SpecialString);
> >     myFunction();
> >     SpecialString = "ok I have replaced the string contents\n";
> >     myFunction();
> >     return 0;
> > }
> > ```
> > This outputs:
> > ```
> > hello here is a string
> > ok I have replaced the string contents
> > ```
> > This is an issue for `StringRef` as well, so I am concerned the [[ 
> > https://github.com/llvm/llvm-project/blob/dc066888bd98c0500ca7b590317dc91ccce0fd38/llvm/lib/LTO/Caching.cpp#L31
> >  | existing caching code ]] is unsafe as well. This was probably fine when 
> > it was used solely with the usage pattern in ThinLTO. As we move it to the 
> > support library should we make it more safe? In particular, we could keep 
> > the parameters Twines but only access them in the top part of the 
> > `localCache` body outside the lambdas.
> Hmm that is a good catch. I think you are right that we should be making a 
> copy of all of these string reference parameters outside of the lambda (which 
> we then capture by copy) to address this issue.
Thanks! These explicit copies have been added at the top of localCache.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111371/new/

https://reviews.llvm.org/D111371

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to