ICE (segfault) in preprocessor

Bug #534880 reported by gerhard
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
gcc
Fix Released
Medium
gcc-defaults (Ubuntu)
Triaged
Low
Unassigned

Bug Description

gcc dies with segmentation violation on Intrepid and Karmic (didn't try others) with the following shell code; this is not an academic example but the maximally reduced version of my code:

echo -e '#include "b.h"\n#include "c.h"' >a.c; echo '# 1 "c.h" 1' >b.h; gcc -E a.c

ProblemType: Bug
Architecture: i386
DistroRelease: Ubuntu 8.10
Package: gcc 4:4.3.1-1ubuntu2
ProcEnviron:
 PATH=.:/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
 LANG=en_US.UTF-8
 SHELL=/bin/bash
SourcePackage: gcc-defaults
Uname: Linux 2.6.27-16-generic i686

Revision history for this message
gerhard (gerhard-dest-unreach) wrote :
tags: added: intrepid
tags: added: karmic
Revision history for this message
Matthias Klose (doko) wrote :

confirmed with 4.4 and 4.5

Changed in gcc-defaults (Ubuntu):
importance: Undecided → Low
status: New → Confirmed
Revision history for this message
In , Doko-v (doko-v) wrote :

seen on any version back to 4.4

$ cat a.c
#include "b.h"
#include "c.h"
$ cat b.h
# 1 "c.h" 1
$ gcc -E a.c
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "a.c"
# 1 "b.h" 1
# 1 "c.h" 1
# 1 "b.h" 2
In file included from a.c:1:0:
b.h:1:0: internal compiler error: Segmentation fault
 # 1 "c.h" 1
 ^
Please submit a full bug report,
with preprocessed source if appropriate.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000d990a8 in ?? ()
(gdb) bt
#0 0x0000000000d990a8 in ?? ()
#1 0x0000000000d997e8 in ?? ()
#2 0x0000000000d9a3ab in _cpp_stack_file ()
#3 0x0000000000d9a844 in _cpp_stack_include ()
#4 0x0000000000d92666 in ?? ()
#5 0x0000000000d931e8 in _cpp_handle_directive ()
#6 0x0000000000d9fa1d in _cpp_lex_token ()
#7 0x0000000000da42d0 in ?? ()
#8 0x00000000005d5af8 in preprocess_file(cpp_reader*) ()
#9 0x00000000005d4591 in c_common_init() ()
#10 0x000000000057faee in c_objc_common_init() ()
#11 0x00000000008b4fe7 in toplev_main(int, char**) ()
#12 0x00007ffff69e8ec5 in __libc_start_main (main=0x5526e0 <main>, argc=12, argv=0x7fffffffe5e8,
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe5d8)
    at libc-start.c:287
#13 0x0000000000552915 in _start ()

Matthias Klose (doko)
Changed in gcc-defaults (Ubuntu):
status: Confirmed → Triaged
Revision history for this message
In , Rguenth (rguenth) wrote :

I think we have a dup of this somewhere

Revision history for this message
In , Matthias Klose (doko) wrote :

seen with trunk 20210306

$ gcc-11 -E a.c
# 0 "a.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "a.c"
# 1 "b.h" 1
# 1 "c.h" 1
# 1 "b.h" 2
In file included from a.c:1:
b.h:1: internal compiler error: Segmentation fault
    1 | # 1 "c.h" 1
      |
0xd041a0 crash_signal
        ../../src/gcc/toplev.c:327
0x11e616c open_file
        ../libcpp/../../src/libcpp/files.c:225
0x165a9ba read_file
        ../libcpp/../../src/libcpp/files.c:770
0x11e62dc _cpp_stack_file
        ../libcpp/../../src/libcpp/files.c:942
0x1684cd2 do_include_common
        ../libcpp/../../src/libcpp/directives.c:853
0x120a24f _cpp_handle_directive
        ../libcpp/../../src/libcpp/directives.c:541
0x1204fa4 _cpp_lex_token
        ../libcpp/../../src/libcpp/lex.c:2809
0x120927f cpp_get_token_1
        ../libcpp/../../src/libcpp/macro.c:2839
0x16841c3 cpp_get_token_with_location(cpp_reader*, unsigned int*)
        ../libcpp/../../src/libcpp/macro.c:3108
0x16841c3 scan_translation_unit
        ../../src/gcc/c-family/c-ppoutput.c:320
0x16841c3 preprocess_file(cpp_reader*)
        ../../src/gcc/c-family/c-ppoutput.c:102
0x167e491 c_common_init()
        ../../src/gcc/c-family/c-opts.c:1195
0x163fb1b lang_dependent_init
        ../../src/gcc/toplev.c:1889
0x163fb1b do_compile
        ../../src/gcc/toplev.c:2186
Please submit a full bug report,
with preprocessed source if appropriate.

summary: - gcc crashes with SIGSEGV
+ ICE (segfault) in preprocessor
Changed in gcc:
importance: Unknown → Medium
status: Unknown → New
Revision history for this message
In , Cvs-commit (cvs-commit) wrote :

The master branch has been updated by Lewis Hyatt <email address hidden>:

https://gcc.gnu.org/g:601dbf2a799f691688dfe78250b5bea2717b5b5e

commit r14-4185-g601dbf2a799f691688dfe78250b5bea2717b5b5e
Author: Lewis Hyatt <email address hidden>
Date: Fri Sep 15 13:31:51 2023 -0400

    libcpp: Fix ICE on #include after a line marker directive [PR61474]

    As noted in the PR, GCC will segfault if a file name is first seen in a
    linemarker directive, and then later seen in a normal #include. This is
    because the fake include process adds the file to the cache with a null PATH
    member. The normal #include finds this file in the cache and then attempts
    to use the null PATH. Resolve by adding the file to the cache with a unique
    starting directory, so that the fake entry will only be found by a
    subsequent fake include, not by a real one.

    libcpp/ChangeLog:

            PR preprocessor/61474
            * files.cc (_cpp_find_file): Set DONT_READ to TRUE for fake
            include files.
            (_cpp_fake_include): Pass a unique cpp_dir* address so
            the fake file will not be found when looked up for real.

    gcc/testsuite/ChangeLog:

            PR preprocessor/61474
            * c-c++-common/cpp/pr61474-2.h: New test.
            * c-c++-common/cpp/pr61474.c: New test.
            * c-c++-common/cpp/pr61474.h: New test.

Revision history for this message
In , Lhyatt (lhyatt) wrote :

Thanks for the testcase, this is fixed for GCC 14.

Changed in gcc:
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.