[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: yacc.c fix to avoid use of uninitialized variables in initial action
From: |
Paul Eggert |
Subject: |
Re: yacc.c fix to avoid use of uninitialized variables in initial action |
Date: |
Sat, 09 Jul 2005 01:31:31 -0700 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Akim Demaille <address@hidden> writes:
> But then yylloc is no longer initialized. I usually initialized
> it there, and then it is the scanner that updates it. I really
> meant to have the previous version.
OK, I installed the following patch; it causes the generated
parser to copy yylloc to yylsp[0] only if the user initialization
code sets yylloc.
> And this value is not used, it is copied. A tool such as Valgrind
> makes the difference.
Sorry, I don't quite follow this point.
We didn't find the problem with valgrind. The problem was found
because GCC 4 is smart enough to warn that yylloc is used without
being initialized, when the initial action doesn't set the line
number.
2005-07-09 Paul Eggert <address@hidden>
* data/yacc.c (yyparse): Undo previous patch. Instead,
set yylsp[0] and yyvsp[0] only if the initial action
sets yylloc and yylval, respectively.
--- yacc.c 9 Jul 2005 07:14:18 -0000 1.93
+++ yacc.c 9 Jul 2005 08:26:29 -0000 1.94
@@ -859,16 +859,20 @@ b4_c_function_def([yyparse], [int], b4_p
#endif
]])
m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar], [[yylsp[0]]])dnl
-m4_pushdef([b4_dollar_dollar], [[yyvsp[0]]])dnl
+m4_pushdef([b4_at_dollar], [m4_define([b4_at_dollar_used])yylloc])dnl
+m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl
/* User initialization code. */
b4_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])dnl
/* Line __line__ of yacc.c. */
-b4_syncline(address@hidden@], address@hidden@])])dnl
-[
- goto yysetstate;
+b4_syncline(address@hidden@], address@hidden@])
+])dnl
+m4_ifdef([b4_dollar_dollar_used],[[ yyvsp[0] = yylval;
+]])dnl
+m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc;
+]])dnl
+[ goto yysetstate;
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |