Christoffer Olsen wrote:
> Mit problem er at strncmp segfaulter første gang den skal returnere
> false, indtil da har det gået meget godt, her er koden for searchRes:
>
> int searchRes()
> {
> int i = 0 ;
>
> for ( i = 0 ; strncmp(yytext,resArray[i],99)!=0 && i<nextRes; i++);
> if ( i < nextRes )
> return resToken[i] ; /* found */
> else return -1;
> }
Når i er lig nextRes laver du først en sammenligning, og returnerer
dernæst -1 uanset hvad sammenligningen gav som resultat.
> Mit spørgsmål går egentlig på hvordan dælen det kan lade sig gøre at
> strcmp bliver syg, når dens argumenter ser ud til at være ok?
Tja, man kunne forestille sig en eller form for hukommelse-relateret
fejl, f.eks. et bufferoverløb som er sket på et tidligere tidspunkt.
Sådanne ting kan vse sig på de underligste måder. Jeg ville prøve at
køre programmet under valgrind (
http://valgrind.kde.org/) og se om det
fandt noget.
> Her er backtrace fra gdb, yytext er et array og resArray er et array
> af char*:
>
> Breakpoint 1, searchRes () at te04a.y:452
> 452 for ( i = 0 ; strncmp(yytext,resArray[i],99)!=0 && i<nextRes; i++);
> (gdb) print yytext
> $4 = "i", '\0' <repeats 98 times>
> (gdb) print resArray[i]
> $5 = 0x40278ff8 "print"
> (gdb) print nextRes
> $6 = 6
> (gdb) step
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x400a7c68 in strncmp () from /lib/tls/libc.so.6
> (gdb) bt
> #0 0x400a7c68 in strncmp () from /lib/tls/libc.so.6
> #1 0x40166170 in timezone () from /lib/tls/libc.so.6
> #2 0xbffff9a0 in ?? ()
> #3 0x08049cc1 in searchRes () at te04a.y:452
> #4 0x080495f5 in yylex () at te04a.y:237
> #5 0x08048a29 in yyparse () at te04a.tab.c:1093
> #6 0x08049f72 in main (argc=2, argv=0xbffffa14) at te04a.y:521