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

            Bug ID: 89672
           Summary: NULL pointer check optimized out for the return value
                    of memchr(NULL, c, 0)
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: him at revl dot org
  Target Milestone: ---

Created attachment 45947
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45947&action=edit
Source that reproduces the problem

The attached code, when compiled with -O1 or more aggressive,
produces incorrect output and exits with return code 1:

$ g++ -Wall -Wextra -Werror -pedantic -O1 -o parser parser.cc
$ ./parser
tok(first)
m_CurrentPtr=[...]
tok(second)
m_CurrentPtr=(nil)
tok()
echo $?
1

When compiled without optimization, or when *any* of the three optimizations
listed below is disabled, the code produces the correct output and exits
normally:

$ g++ -Wall -Wextra -Werror -pedantic -O0 -o parser parser.cc
$ ./parser
tok(first)
m_CurrentPtr=[...]
tok(second)
echo $?
0

It appears that the check m_CurrentPtr != nullptr in the second call to
PrintTokenIfFound() is optimized out if the built-in memchr is used.
If a custom implementation of memchr (FindNewline()) is used in the
second call, the code produces the correct result.

Adding *any* of these options to the command line also fixes the problem:

-fno-delete-null-pointer-checks
-fno-tree-dominator-opts
-fno-inline

The problem is also reproducible with older versions (I tried 4.9.3 and
7.3.0).

Reply via email to