help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Segmentation Fault bei flex+bison am Fileende


From: address@hidden
Subject: Segmentation Fault bei flex+bison am Fileende
Date: Mon, 02 Aug 2010 15:52:16 +0200
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.11) Gecko/20100711 Thunderbird/3.0.6

Hallo,

ich möchte einen Parser bauen der die Eigaben von IP-Adressen
auf Plausibilität überprüft.

Zum test baue ich eine Liste mit gültigen und ungültigen ip-adressen aus einen Shellscript und gebe diese dem Scanner zu lesen.

Das läuft auch ganz prima durch, aber beim Ende (eof) gibt es einen
seg-fault.

Ich such schon zwei Tage und finde den Fehler nicht.


testbench - geneating testbench/gen_ipnumbers.log from testbench/gen_ipnumbers.sh
./testbench/gen_ipnumbers.sh > testbench/gen_ipnumbers.sh.test
./sb_mailscan < testbench/gen_ipnumbers.sh.test 2> testbench/gen_ipnumbers.sh.test.log /bin/sh: line 1: 3952 Segmentation fault (core dumped) ./sb_mailscan < testbench/gen_ipnumbers.sh.test 2> testbench/gen_ipnumbers.sh.test.log
make[1]: *** [testbench/gen_ipnumbers.log] Error 139
make[1]: Leaving directory sb_mailscan'
make: *** [test] Error 2
bash-3.2$

http://svn.origo.ethz.ch/wsvn/solid-barrage/src/cli/sb_mailscan



das Generator-Script geht
--------------------------
#!/usr/bin/sh
for i in 0 1 -1 127 128 254 255 256; do
        for j in 0 1 -1 127 128 254 255 256; do
                for k in 0 1 -1 127 128 254 255 256; do
                        for l in 0 1 -1 127 128 254 255 256; do
                                echo $i"."$j"."$k"."$l
                        done
                done
        done
done
echo -e "\n"

lex
---
der canner ist noch nicht ganz fertig, denn z.Bsp. die 0.0.0.256 erkennt er noch nicht richtig

%}
INVALID_OCTET (-[0-9]+)|([0][0-9]+)|([0-9][0-9][0-9][0-9]+)|([3-9][0-9][0-9]+)|([2][6-9][0-9]+)|([2][5][6-9]+) VALID_OCTET ([2][5][0-5])|([2][0-4][0-9])|([1][0-9][0-9])|([1-9][0-9])|([0-9])

%%
{INVALID_OCTET} { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<invalid-octet=%s>",yylval.ptr_c); return (INVALID_OCTET); } {VALID_OCTET}[.]{VALID_OCTET}[.]{VALID_OCTET}[.]{VALID_OCTET} { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<valid-ip=%s>",yylval.ptr_c); return (VALID_IP); } {VALID_OCTET} { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<valid-octet=%s>",yylval.ptr_c); return (VALID_OCTET); } \n { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<\\n>"); return (NEWLINE); }; [.] { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<dot>"); return (DOT); }; [ ] { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<spc>"); return (SPACE); }; [\t ] { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<\\t>"); return (WSPACE); }; . { p=(char *) calloc(strlen(yytext)+1,sizeof(char)); yylval.ptr_c=strcpy(p,yytext); LEX_DEBUG("<pa>"); return (OTHER); };
%%

bsion
-----
%start ipadrln
%token <ptr_c> VALID_OCTET INVALID_OCTET VALID_IP
%type <ptr_c> ipadrln
%type <ptr_c> ipadr
%type <ptr_c> printable
%token <ptr_c> NEWLINE DOT OTHER SPACE WSPACE MINUS END

%%
ipadrln: {/* empty */}
        | ipadr {$$=$1;}
        | ipadrln ipadr { $$=$2;}
        | ipadrln printable { $$=$2;}
;


ipadr: VALID_IP { sprintf($$,"valid-ip=%s",$1); };

printable: NEWLINE { $$=$1; YACC_DEBUG("[\\n] valid=%i\n", valid_ip); valid_ip=1 }
        | OTHER { $$=$1; YACC_DEBUG("[other]"); valid_ip=0;}
        | SPACE  {$$=$1; YACC_DEBUG("[ ]"); valid_ip=0;}
        | WSPACE {$$=$1; YACC_DEBUG("[\t]"); valid_ip=0;}
        | VALID_OCTET {$$=$1; YACC_DEBUG("[valid-octet=%s]",$1); valid_ip=0;}
        | INVALID_OCTET {$$=$1; YACC_DEBUG("[invalid-octet=%s]",$1); 
valid_ip=0;}
        | DOT { $$=$1; YACC_DEBUG("[dot]"); valid_ip=0; }
;

 %%
// come c-code


das log sieht auch noch gut - kein parse-error
-----------------------------------------

die 0.0.0.256 wird nicht richtig vom scanner erkannt, aber
ist richtigerweie invalid;

l31=<valid-ip=0.0.0.0>l33=<\n>y52=[\n] valid=0
l31=<valid-ip=0.0.0.1>l33=<\n>y52=[\n] valid=1
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l30=<invalid
-octet=-1>y57=[invalid-octet=-1]l33=<\n>y52=[\n] valid=0
l31=<valid-ip=0.0.0.127>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.0.128>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.0.254>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.0.255>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.0.25>l32=<valid-octet=6>y56=[valid-octet=6]l33=<\n>y52=[\n] valid=0
l31=<valid-ip=0.0.1.0>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.1.1>l33=<\n>y52=[\n] valid=1
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l32=<valid-octet=1>y56=[valid-octet=1]l34=<dot>y58=[dot]l30=<invalid
-octet=-1>y57=[invalid-octet=-1]l33=<\n>y52=[\n] valid=0
l31=<valid-ip=0.0.1.127>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.1.128>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.1.254>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.1.255>l33=<\n>y52=[\n] valid=1
l31=<valid-ip=0.0.1.25>l32=<valid-octet=6>y56=[valid-octet=6]l33=<\n>y52=[\n] valid=0
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l30=<invalid-octet=-1>y57=[invalid-octet=-1]l34=<dot>y58=[dot]l32=<v
alid-octet=0>y56=[valid-octet=0]l33=<\n>y52=[\n] valid=0
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l30=<invalid-octet=-1>y57=[invalid-octet=-1]l34=<dot>y58=[dot]l32=<v
alid-octet=1>y56=[valid-octet=1]l33=<\n>y52=[\n] valid=0
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l30=<invalid-octet=-1>y57=[invalid-octet=-1]l34=<dot>y58=[dot]l30=<i
nvalid-octet=-1>y57=[invalid-octet=-1]l33=<\n>y52=[\n] valid=0
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l30=<invalid-octet=-1>y57=[invalid-octet=-1]l34=<dot>y58=[dot]l32=<v
alid-octet=127>y56=[valid-octet=127]l33=<\n>y52=[\n] valid=0
l32=<valid-octet=0>y56=[valid-octet=0]l34=<dot>y58=[dot]l32=<valid-octet=0>y56=[valid-octe
t=0]l34=<dot>y58=[dot]l30=<invalid-octet=-1>y57=[invalid-octet=-1]l34=<dot>y58=[dot]l32=<v
alid-octet=128>y56=[valid-octet=128]l33=<\n>y52=[\n] valid=0

[...uninteresante Zeilen gelöscht...]

l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57
=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<d
ot>y58=[dot]l32=<valid-octet=128>y56=[valid-octet=128]l33=<\n>y52=[\n] valid=0
l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57
=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<d
ot>y58=[dot]l32=<valid-octet=254>y56=[valid-octet=254]l33=<\n>y52=[\n] valid=0
l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57
=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<d
ot>y58=[dot]l32=<valid-octet=255>y56=[valid-octet=255]l33=<\n>y52=[\n] valid=0
l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57
=[invalid-octet=256]l34=<dot>y58=[dot]l30=<invalid-octet=256>y57=[invalid-octet=256]l34=<d
ot>y58=[dot]l30=<invalid-octet=256>y57=[invalid-octet=256]l33=<\n>y52=[\n] valid=0
l33=<\n>y52=[\n] valid=1
l33=<\n>y52=[\n] valid=1
DBG:sb_mailscan.c at line=22     ./cli/sb_mailscan: main() yyparse=0=OK


die main-funktion
------------------

#define LEX_DEBUG(fmt,args...) fprintf(stderr,"l%i=" fmt, __LINE__, ## args)
#define YACC_DEBUG(fmt,args...) fprintf(stderr,"y%i=" fmt, __LINE__, ## args)

int main(){
        static int ret_i;
        ret_i=yyparse();
        if (ret_i == 0){
                P_DEBUG("./cli/sb_mailscan: main() yyparse=OK\n");
                exit (0);
        }
        else {
                P_DEBUG("./cli/sb_mailscan: main() yyparse=Parse-Error\n");
                exit (1);

        };
        return 0;
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]