Hello!

I've been told to send this here.  In tools/llvm-ld/llvm-ld.cpp,
line 360, a const char* to a temporary std::string is being
stored, with the string going out of scope right after, making
that pointer invalid.

    std::string lib_name = "-l" + LinkItems[index].first;
    args.push_back(lib_name.c_str());
    <end of scope>

The attached patch fixes this in a simple way.

jlh
Index: llvm-ld.cpp
===================================================================
RCS file: /var/cvs/llvm/llvm/tools/llvm-ld/llvm-ld.cpp,v
retrieving revision 1.51
diff -u -r1.51 llvm-ld.cpp
--- llvm-ld.cpp	29 Apr 2007 23:59:47 -0000	1.51
+++ llvm-ld.cpp	30 Apr 2007 13:34:21 -0000
@@ -330,6 +330,9 @@
   //  We can't just assemble and link the file with the system assembler
   //  and linker because we don't know where to put the _start symbol.
   //  GCC mysteriously knows how to do it.
+
+  // args_temp is for storing temporary strings while we have a const char * to them
+  std::vector<std::string> args_temp;
   std::vector<const char*> args;
   args.push_back(gcc.c_str());
   args.push_back("-fno-strict-aliasing");
@@ -354,8 +357,8 @@
   for (unsigned index = 0; index < LinkItems.size(); index++)
     if (LinkItems[index].first != "crtend") {
       if (LinkItems[index].second) {
-        std::string lib_name = "-l" + LinkItems[index].first;
-        args.push_back(lib_name.c_str());
+        args_temp.push_back("-l" + LinkItems[index].first);
+        args.push_back(args_temp.back().c_str());
       } else
         args.push_back(LinkItems[index].first.c_str());
     }
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to