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

            Bug ID: 70262
           Summary: Segmentation fault with large stack array, no fault
                    when alloca the same size
           Product: gcc
           Version: 5.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nickdu at msn dot com
  Target Milestone: ---

I just ran into a segmentation fault in a binary I created with the gcc
compiler.  The code is written in c.  The problem appears to be with a stack
allocated buffer.  The buffer is large, 1024 * 1024 chars.  I realize that
there are some limitations on the stack size, though I think I'm still under
the limits.  The strange thing is that when I changed to using alloca(1024 *
1024) the segmentation fault no longer occurs.  My project consists of a bunch
of code and I have not yet attempted to pare it down to the bare minimum.  I
will attempt to give you as much information as I can with respect to the
function in question.

The signature of the function is:

void log_event(int level, const char* format, ...)

The lines of code in question are:

            // INFO and more critical we send to HTTP endpoint.                 

            if ((level <= LOG_LEVEL_INFO) && (write_log_pipe != -1))
                {

                // Generate json for event.                                     

                char json[1024 * 1024];
//              char* json = alloca(1024 * 1024);                               
                unsigned int len = 1024 * 1024;
//              generate_json(&ts, host_name, level_string, message,            
//                      json, &len);                                            
                strcpy(json, "hello, world");
                len = strlen(json);

                printf("log_event(), len = %d, json = %s\n", len, json);
                if (len < 1024 * 1024)
                    {

                    // Write json event to log pipe.                            

                    if (pthread_mutex_lock(&log_pipe_lock) == 0)
                        {
                        write(write_log_pipe, &len, sizeof(len));
                        write(write_log_pipe, json, len);
                        pthread_mutex_unlock(&log_pipe_lock);
                        }
                    }
                }

As you can see I was playing around with commenting out pieces of code.  Ignore
the commented function generate_json().  The code as it is above will generate
a segmentation fault.  If I comment out the 1024 * 1024 char array and
uncomment the alloca the segmentation fault goes away.

Thanks,
Nick

Reply via email to