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;
}
_______________________________________________
help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison