当前位置: 技术问答>linux和unix
lex&yacc Segmentation fault
来源: 互联网 发布时间:2017-04-08
本文导语: 最近要写一个shell程序,用lex和yacc解析命令,写了一个简单的规则,但是运行的时候就出现Segmentation fault(core dumped)错误。麻烦大家帮我看看吧 token.l %{ #include #include "parser.tab.h" void yyerror(char *); int yywrap(); %}...
最近要写一个shell程序,用lex和yacc解析命令,写了一个简单的规则,但是运行的时候就出现Segmentation fault(core dumped)错误。麻烦大家帮我看看吧
token.l
parser.y
其中make_command()函数为:
这个函数的功能就是想要将解析得到的结果存储下来。麻烦大家帮忙看看啊
token.l
%{
#include
#include "parser.tab.h"
void yyerror(char *);
int yywrap();
%}
%%
[a-zA-Z0-9-] {yylval = *yytext; return STRING;}
[ /t] ;
. yyerror("Invalid character");
%%
int yywrap()
{
return 1;
}
parser.y
%{
#include
#include
#include "functions.h"
#define YYSTYPE char*
YYSTYPE yylva;
int yylex();
void yyerror(char *);
%}
%token STRING
%%
line :
|command
{
print_test();
}
;
command :fgcommand
|fgcommand '&'
{
make_command(0,NULL);
}
;
fgcommand :simple_cmd
{
push_command();
}
;
simple_cmd :prog_invocation input_redirect output_redirect
;
prog_invocation:STRING args
{
make_command(1,$1);
}
;
input_redirect:
|'' STRING
{
make_command(3,$2);
}
;
args:
|args STRING
{
make_command(1,$2);
}
;
%%
void yyerror(char *s)
{
printf("%sn",s);
}
int main()
{
yyparse();
return 0;
}
其中make_command()函数为:
void make_command(int type,char *str)
{
if(type == 0) // a back ground command
{
is_back = 1;
}
else if(type == 1) // command args
{
strcpy(cmd_buff[arg_index ++],str);
}
else if(type == 2) // input file name
{
strcpy(input_file,str);
}
else if(type == 3) // output file name
{
strcpy(output_file,str);
}
}
这个函数的功能就是想要将解析得到的结果存储下来。麻烦大家帮忙看看啊
|
lex与yacc本身分析看起来没问题,出错可能在strcpy,特别是strcpy(cmd_buff[arg_index ++],str);有可能会溢出
|
使用core文件和gdb调试一下;
检查一下strcpy的第一个参数的合法性,不能是这些情况:
char *example = NULL;
char *example = "abc";
char *example = (char *)0;
在想example赋值时会出错;
其他的没仔细看,也看不懂。。。囧。。。
检查一下strcpy的第一个参数的合法性,不能是这些情况:
char *example = NULL;
char *example = "abc";
char *example = (char *)0;
在想example赋值时会出错;
其他的没仔细看,也看不懂。。。囧。。。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。