[Bug go/90110] [9 Regression] libgo fails to build against glibc 2.19

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Wed Apr 17 13:31:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90110

--- Comment #6 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 17 Apr 2019, ian at airs dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90110
> 
> --- Comment #4 from Ian Lance Taylor <ian at airs dot com> ---
> Thanks for the file.  Unfortunately it looks fine.
> 
> The error is coming from Import_function_body::read_type in
> gcc/go/gofrontend/import.cc.  At the point of the error this->body_ +
> this->off_ points to a string starting with "<type 4>,".  The function starts
> like this:
> 
>   this->require_c_string("<type ");
>   size_t start = this->off_;
>   size_t i;
>   int c = '\0';
>   for (i = start; i < this->body_.length(); ++i)
>     {
>       c = static_cast<unsigned char>(this->body_[i]);
>       if (c != '-' && (c < '0' || c > '9'))
>         break;
>     }
>   this->off_ = i + 1;
> 
>   char *end;
>   long val = strtol(this->body_.substr(start, i - start).c_str(), &end, 10);

Just a wild guess - does this->body_.substr(start, i - start).c_str() 
really live until after strtol has completed?  IIRC I saw this kind
of errors in other codes...  since the temporary std::string isn't
passed to the function it should be destroyed.  Assuming this->body_
is a std::string, of course.

Using profiledbootstrap might just expose this "issue" I guess.

Trying whether

Index: gcc/go/gofrontend/import.cc
===================================================================
--- gcc/go/gofrontend/import.cc (revision 270403)
+++ gcc/go/gofrontend/import.cc (working copy)
@@ -1478,7 +1478,8 @@ Import_function_body::read_type()
   this->off_ = i + 1;

   char *end;
-  long val = strtol(this->body_.substr(start, i - start).c_str(), &end, 
10);
+  std::string subs = this->body_.substr(start, i - start);
+  long val = strtol(subs.c_str(), &end, 10);
   if (*end != '\0' || i > 0x7fffffff)
     {
       if (!this->saw_error_)

fixes the issue for me (will report back tomorrow).  Just in case
this is indeed an obvious error feel free to fix faster than that ;)


More information about the Gcc-bugs mailing list