Bug 24101 - [3.4/4.0/4.1 Regression] Segfault with preprocessed source
Summary: [3.4/4.0/4.1 Regression] Segfault with preprocessed source
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 4.1.0
: P2 normal
Target Milestone: 3.4.5
Assignee: Per Bothner
URL: http://gcc.gnu.org/ml/gcc-patches/200...
Keywords: ice-on-invalid-code, monitored, patch
Depends on:
Blocks:
 
Reported: 2005-09-28 12:43 UTC by Uroš Bizjak
Modified: 2005-11-09 07:55 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work: 3.3.3 3.4.5 4.0.3 4.1.0
Known to fail: 3.4.0 4.0.0
Last reconfirmed: 2005-10-31 16:58:29


Attachments
proposed patch for initial testcase (532 bytes, patch)
2005-10-31 20:53 UTC, Per Bothner
Details | Diff
proposed patch for second testcase (334 bytes, patch)
2005-10-31 20:56 UTC, Per Bothner
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Uroš Bizjak 2005-09-28 12:43:07 UTC
This testcase segfaults for c and c++.

--cut here--
# 1 "/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.0/include/stddef.h" 1 3 4
--cut here--

gcc express-min.i

In file included from express-min.i:1:
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.0/include/stddef.h:1: internal compiler
error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.

This behaviour is quite annoying: if delta tool is used to minimize a
preprocessed file that segfaults, it always produces this kind of one-line
minimized testcase.
Comment 1 Andrew Pinski 2005-09-28 12:56:01 UTC
Confirmed, backtrace:
#0  0x0804bc76 in fe_file_change (new_map=0xa30cce4)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/gcc/c-lex.c:236
#1  0x080997a5 in cb_file_change (pfile=0xa303928, new_map=0xa30cce4)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/gcc/c-opts.c:1405
#2  0x084f04f3 in _cpp_do_file_change (pfile=0xa303928, reason=LC_ENTER, 
    to_file=0xa30e720 "/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.0/include/stddef.h", file_line=1, 
    sysp=2) at /home/peshtigo/pinskia/src/gnu/gcc/src/libcpp/directives.c:921
#3  0x084f03e8 in do_linemarker (pfile=0xa303928)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/libcpp/directives.c:903
#4  0x084efafd in _cpp_handle_directive (pfile=0xa303928, indented=0)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/libcpp/directives.c:430
#5  0x084f609b in read_original_filename (pfile=0xa303928)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/libcpp/init.c:506
#6  0x084f6015 in cpp_read_main_file (pfile=0xa303928, fname=0xbfff8c42 "t.i")
    at /home/peshtigo/pinskia/src/gnu/gcc/src/libcpp/init.c:480
#7  0x0809a0db in c_common_post_options (pfilename=0x86373a8)
    at /home/peshtigo/pinskia/src/gnu/gcc/src/gcc/c-opts.c:1046


: Search converges between 2004-02-01-trunk (#445) and 2004-03-01-trunk (#446).
: Search converges between 2004-02-02-3.4 (#1) and 2004-03-01-3.4 (#2).

Comment 2 janis187 2005-10-03 16:15:30 UTC
A regression hunt identified this patch from bothner@gcc.gnu.org:

  http://gcc.gnu.org/ml/gcc-cvs/2004-02/msg00236.html
Comment 3 Uroš Bizjak 2005-10-14 12:55:21 UTC
The testcase could be furhter reduced into perhaps the smallest testcase that ICEs, ever (name this file for example ttt.i):

--cut here--
#
--cut here--

gcc ttt.i
ttt.i:1: internal compiler error: Segmentation fault

Comment 4 Mark Mitchell 2005-10-31 05:57:01 UTC
Leaving as P2.  This really should be fixed.
Comment 5 Per Bothner 2005-10-31 16:58:29 UTC
The two test cases appear to be unrelated problems.

The inital report is because an invalid line marker is seen before debug_hooks is set in process_options.  fe_enter doesn't normally see an LC_ENTER during
read_original_filename.
One possible fix to to initialize debug_hooks statically in toplev.c:
const struct gcc_debug_hooks *debug_hooks = &do_nothing_debug_hooks;

The other testcase is because _cpp_pop_buffer is called prematurely, because
the code doesn't know we're in a directive.
A possible fix for that is to set/clear pfile->state.in_directive areound the second _cpp_lex_direct in read_original_filename:
  if (token->type == CPP_HASH)
    {
      pfile->state.in_directive = 1;
      token1 = _cpp_lex_direct (pfile);
      _cpp_backup_tokens (pfile, 1);
      pfile->state.in_directive = 0;

I haven't updated my cvs archive yet, but if someone coudl volunteer to test these fixes that woudl be appreciated.
Comment 6 Andrew Pinski 2005-10-31 20:20:47 UTC
I can test the first one since it is an easy one to test.
Comment 7 Per Bothner 2005-10-31 20:53:52 UTC
Created attachment 10088 [details]
proposed patch for initial testcase
Comment 8 Per Bothner 2005-10-31 20:56:40 UTC
Created attachment 10090 [details]
proposed patch for second testcase
Comment 9 Uroš Bizjak 2005-11-08 10:04:05 UTC
Patch here: http://gcc.gnu.org/ml/gcc-patches/2005-11/msg00498.html
Comment 10 uros 2005-11-09 06:30:10 UTC
Subject: Bug 24101

Author: uros
Date: Wed Nov  9 06:30:03 2005
New Revision: 106677

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=106677
Log:
libcpp/

	PR c/24101
	* init.c (read_original_filename): Temporarily set
	state.in_directive before calling _cpp_lex_direct for
	CPP_HASH tokens.

gcc/

	PR c/24101
	* toplev.c (process_options): Initialize debug_hooks early
	in case lang_hooks.post_options ends up calling a debug_hook.

gcc/testsuite/

	PR c/24101
	* gcc.dg/pr24101-1.i, gcc.dg/pr24101-2.i: New tests.
	* gcc.dg/dg.exp: Run main loop also for *.i files.


Added:
    trunk/gcc/testsuite/gcc.dg/pr24101-1.i
    trunk/gcc/testsuite/gcc.dg/pr24101-2.i
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/dg.exp
    trunk/gcc/toplev.c
    trunk/libcpp/ChangeLog
    trunk/libcpp/init.c

Comment 11 uros 2005-11-09 06:42:58 UTC
Subject: Bug 24101

Author: uros
Date: Wed Nov  9 06:42:53 2005
New Revision: 106678

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=106678
Log:
libcpp/

	PR c/24101
	* init.c (read_original_filename): Temporarily set
	state.in_directive before calling _cpp_lex_direct for
	CPP_HASH tokens.

gcc/

	PR c/24101
	* toplev.c (process_options): Initialize debug_hooks early
	in case lang_hooks.post_options ends up calling a debug_hook.

gcc/testsuite/

	PR c/24101
	* gcc.dg/pr24101-1.i, gcc.dg/pr24101-2.i: New tests.
	* gcc.dg/dg.exp: Run main loop also for *.i files.


Added:
    branches/gcc-4_0-branch/gcc/testsuite/gcc.dg/pr24101-1.i
      - copied unchanged from r106677, trunk/gcc/testsuite/gcc.dg/pr24101-1.i
    branches/gcc-4_0-branch/gcc/testsuite/gcc.dg/pr24101-2.i
      - copied unchanged from r106677, trunk/gcc/testsuite/gcc.dg/pr24101-2.i
Modified:
    branches/gcc-4_0-branch/gcc/ChangeLog
    branches/gcc-4_0-branch/gcc/testsuite/ChangeLog
    branches/gcc-4_0-branch/gcc/testsuite/gcc.dg/dg.exp
    branches/gcc-4_0-branch/gcc/toplev.c
    branches/gcc-4_0-branch/libcpp/ChangeLog
    branches/gcc-4_0-branch/libcpp/init.c

Comment 12 uros 2005-11-09 07:51:55 UTC
Subject: Bug 24101

Author: uros
Date: Wed Nov  9 07:51:51 2005
New Revision: 106679

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=106679
Log:
gcc/

	PR c/24101
	* toplev.c (process_options): Initialize debug_hooks early
	in case lang_hooks.post_options ends up calling a debug_hook.
        * cppinit.c (read_original_filename): Temporarily set
        state.in_directive before calling _cpp_lex_direct for
        CPP_HASH tokens.

gcc/testsuite/

	PR c/24101
	* gcc.dg/pr24101-1.i, gcc.dg/pr24101-2.i: New tests.
	* gcc.dg/dg.exp: Run main loop also for *.i files.


Added:
    branches/gcc-3_4-branch/gcc/testsuite/gcc.dg/pr24101-1.i
      - copied unchanged from r106677, trunk/gcc/testsuite/gcc.dg/pr24101-1.i
    branches/gcc-3_4-branch/gcc/testsuite/gcc.dg/pr24101-2.i
      - copied unchanged from r106677, trunk/gcc/testsuite/gcc.dg/pr24101-2.i
Modified:
    branches/gcc-3_4-branch/gcc/ChangeLog
    branches/gcc-3_4-branch/gcc/cppinit.c
    branches/gcc-3_4-branch/gcc/testsuite/ChangeLog
    branches/gcc-3_4-branch/gcc/testsuite/gcc.dg/dg.exp
    branches/gcc-3_4-branch/gcc/toplev.c

Comment 13 Uroš Bizjak 2005-11-09 07:55:51 UTC
Fixed everywhere.