Bug#4232: bison dumps core
Package: bison
Version: A2.6-12
The following input file (which contains errors, I know :-) causes
bison to dump core.
I have no idea wether this is a libc or a bison error. Gdb tells me
the following:
$ gdb /usr/bin/bison core
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.15.1 (i486-linux), Copyright 1995 Free Software Foundation, Inc...
(no debugging symbols found)...
Core was generated by `bison crash.y'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.5.2.18...(no debugging symbols found)...done.
Reading symbols from /lib/ld-linux.so.1...(no debugging symbols found)...done.
#0 0x4003c567 in malloc ()
Here's the input file (called crash.y):
%{
#include <time.h>
#define YYDEBUG 1
time_t currtime;
struct tm currtm;
struct tm exectm;
%}
%union {
struct tm tmstruct;
time_t timet;
int intval;
}
%token INT
%token NOW
%token TIMEZONE_NAME
%token AM PM
%token NOON MIDNIGHT TEATIME
%token SUN MON TUE WED THU FRI SAT
%token TODAY TOMORROW
%token NEXT
%token MINUTE HOUR DAY WEEK MONTH YEAR
%token JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
%token WORD
%type <intval> inc_period
%start timespec
%%
timespec : time
| time date
| time increment
| time date increment
| time decrement
| time date decrement
| nowspec
;
nowspec : now
| now increment
| now decrement
;
now: : NOW
;
time : hr24clock_hr_min
| hr24clock_hr_min timezone_name
| hr24clock_hour time_sep minute
| hr24clock_hour time_sep minute timezone_name
| hr24clock_hour am_pm
| hr24clock_hour am_pm timezone_name
| hr24clock_hour time_sep minute am_pm
| hr24clock_hour time_sep minute am_pm timezone_name
| NOON
| MIDNIGHT
| TEATIME
;
date : month_name day_number
| month_name day_number ',' year_number
| day_of_week
| TODAY
| TOMORROW
;
increment : '+' inc_number inc_period
{
switch($3) {
case MINUTE:
exectm.tm_min
break;
default:
yyerror("Internal parser error");
YYERROR;
}
}
| NEXT inc_period
;
decrement : '-' inc_number inc_period
;
inc_period : MINUTE { $$ = MINUTE ; }
| HOUR { $$ = HOUR ; }
| DAY { $$ = DAY ; }
| WEEK { $$ = WEEK ; }
| MONTH { $$ = MONTH ; }
| YEAR { $$ = YEAR ; }
;
hr24clock_hr_min: INT
;
timezone_name : TIMEZONE_NAME
;
hr24clock_hour : INT
;
minute : INT
;
am_pm : AM
| PM
;
month_name : JAN
| FEB
| MAR
| APR
| MAY
| JUN
| JUL
| AUG
| SEP
| OCT
| NOV
| DEC
;
day_number : INT
;
year_number : INT
;
day_of_week : SUN
| MON
| TUE
| WED
| THU
| FRI
| SAT
;
inc_number : INT
;
time_sep : ':'
| '\''
| '.'
| 'h'
| ','
;
%%
#include "mydate.h"
time_t parsetime(int, char **);
int
main(int argc, char **argv)
{
#ifdef YYDEBUG
yydebug = 1;
#endif
currtime = time(NULL);
currtm = *localtime(&currtime);
yyparse();
}
int yyerror(char *s)
{
fprintf(stderr,"%s. Last token seen: %s\n",s, last_token);
return 0;
}
Reply to: