[Bug c/80706] New: peephole2 uses uninitialized stack variables on i686

staticfloat at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed May 10 18:04:00 GMT 2017


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

            Bug ID: 80706
           Summary: peephole2 uses uninitialized stack variables on i686
           Product: gcc
           Version: 7.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: staticfloat at gmail dot com
  Target Milestone: ---

This is a GCC bug stemming from this issue [1] on the JuliaLang bug tracker.

While compiling the project openlibm [2] using GCC 7.1.0 targeting i686, the
peephole2 optimization pass generates code that uses uninitialized stack
memory.  The process of discovery can be seen in [1], but I will summarize
here.

Openlibm is a replacement for libm on various platforms.  It contains an acos()
implementation that compiles properly on GCC 6.3.0, or GCC 7.1.0 with
-fno-peephole2.  If peephole2 is enabled, the acos() function returns incorrect
results because it pulls in a piece of uninitialized stack.  From a library
user's perspective, this can be triggered through the use of a .C program such
as this one [3] (there is example shell output shown at the bottom of that
link).  This example sets up the stack such that any uninitialized access
results in extremely large numbers.  Note that we call acos() twice, because
the first time we call, the dl_runtime_resolve() stuff that patches the
openlibm library's acos() function into the C process sets up the stack such
that uninitialized access sees extremely small values.

We then took this example, ran it through creduce, and ended up with this
reduced case [4].  This reduced case still calculates the correct value of
acos(0.8), however when compiled with -fpeephole2, the uninitialized memory
causes the computation to change.  Note that because this reduced case does not
purposefully set up the stack like the code in [3] does, the change in the
computation depends on the vagaries of how the stack is setup.


[1] https://github.com/JuliaLang/julia/issues/21742
[2] https://github.com/JuliaLang/openlibm
[3] https://gist.github.com/staticfloat/70651dfd50a9995492ac494d47065d26
[4] https://gist.github.com/staticfloat/d357b985eab757f393fa7e5ff1ee4101


More information about the Gcc-bugs mailing list