Jak już jesteśmy przy tajemniczych padach...

Jacek Konieczny jajcus w pld.org.pl
Pon, 12 Sty 2004, 18:20:29 CET


... na różnych architekturach, to ja mam nową ciekawostkę rodem 
z AMD64:

Budowa pam.spec wywala się z:
bison -y  -d `test -f 'pam_conv.y' || echo './'`pam_conv.y
Memory fault

Z gdb udało mi się uzyskać tyle:
#0  0x000000000041fca7 in quotearg_buffer_restyled (buffer=0x536040
"\"OK", buffersize=256,
    arg=0x0, argsize=18446744073709551615,
quoting_style=c_quoting_style, o=0xbfffaf40)
    at quotearg.c:481
#1  0x000000000041fdc1 in quotearg_buffer (buffer=0x536040 "\"OK",
buffersize=256, arg=0x0,
    argsize=18446744073709551615, o=0x0) at quotearg.c:503
#2  0x000000000041feaf in quotearg_n_options (n=0, arg=0x0,
argsize=18446744073709551615,
    options=0xbfffaf40) at quotearg.c:560
#3  0x0000000000420006 in quotearg_n_style (n=0, s=256, arg=0x0) at
quotearg.c:600
#4  0x00000000004129c3 in epilogue_augment (
    epilogue=0x544d40 "\n\n#include \"lex.yy.c\"\n\nconst char
*old_to_new_ctrl_flag(const char *old)\n{\n    static const char
*clist@{@} =
{\n\t\"requisite\",\n\t\"required\",\n\t\"sufficient\",\n\t\"optional\",\n\tNULL,\n
};\n    int i;\n\n    for"..., loc=
        {start = {file = 0x0, line = 4271808, column = 0}, end = {file =
0x538600 "pam_conv.y", line = 205, column = 1}}) at reader.c:93
#5  0x000000000040fb28 in gram_parse () at parse-gram.y:399
#6  0x000000000041394e in reader () at reader.c:501
#7  0x0000000000406a0d in main (argc=4, argv=0xbffff268) at main.c:80


Podejżane jest to: 
        {start = {file = 0x0, line = 4271808, column = 0}, end = {file =
0x538600 "pam_conv.y", line = 205, column = 1}}

To się bierze w tym kawałku kodu bisona (src/reader.c):
void
epilogue_augment (const char *epilogue, location loc)
{
  char *extension = NULL;
  obstack_fgrow1 (&muscle_obstack, "]b4_syncline([[%d]], [[",
loc.start.line);
  MUSCLE_OBSTACK_SGROW (&muscle_obstack,
                        quotearg_style (c_quoting_style, loc.start.file));

loc.start.file jest równe NULL, i stąd później się wykrzacza.
Sprawdziłem że na i686 w tym miejscu loc.start.file!=NULL, więc wyraźnie
na AMD64 jest coś nie tak.

IMHO felerny może być albo bison albo flex, ewentualnie kompilator (przy
kompilacji bez optmalizacji się nie sypie). Ani w przypadku flexa, ani w
przypadku bisona kompilator nie daje żadnych podejrzanych warningów (po
dodaniu -Wall do %{rpmcflags}). Jeden mało-podejrzany warning w bisonie
poprawiłem, ale nie pomogło.

Jest jakiś chętny do rozwiązania zagadki?

Pozdrowienia,
        Jacek



Więcej informacji o liście dyskusyjnej pld-devel-pl