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

            Bug ID: 90348
           Summary: Small inlined function has local variables in invalid
                    stack location
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pieter.wuille at gmail dot com
  Target Milestone: ---

Created attachment 46289
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46289&action=edit
Source file to reproduce the problem

In attachment is a small source file that seems to be miscompiled with "-O1
-finline-small-functions".

Tested versions/environments where the issue appears:
* GCC 7.3, Ubuntu 18.04.2, x86_64, "gcc -O1 -finline-small-functions test.i -o
test"
* GCC 8.3, Ubuntu 18.04.2, x86_64, "gcc -O1 -finline-small-functions test.i -o
test"
* GCC 8.3, Ubuntu 18.04.2, x86_64, "gcc -m32 -O1 -finline-small-functions
test.i -o test"
* GCC 9.0, Fedora 30, i686, "gcc -O2 test.i -o test"

In a loop, a 4-byte (or larger) char array "in" is created, and then
increasingly long prefixes initialized to zero. A small inlinable function
"set_one_on_stack" is invoked during the loop that should have no effect (it
sets a local variable "buf" to one in a roundabout way), but apparently the
"buf" variable is given the same stack location as the caller's "in" variable,
overwriting the latter. When compiled incorrectly, an unexpected assertion
occurs.

The test file is a reduced version of an issue observed on some platforms in
the Bitcoin Core unit tests. See
https://github.com/bitcoin/bitcoin/issues/14580 for more details.

Reply via email to