具有弯曲野牛和yyparse的分割错误

时间:2014-12-21 14:58:42

标签: c gcc bison lex

当这个循环返回了核心转储的分段错误时,我试图实现flex和bison 使用第一个文件,它工作正常,但下一个文件崩溃并打印成终端分段错误。

DIR *dir;
struct dirent *ent;

    if ((dir = opendir ("./Corpus")) != NULL) 
    {
      while ((ent = readdir (dir)) != NULL) 
      { 
        if ((strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0))
         {
            printf("%s\n",ent->d_name);
            yyin = fopen(ent->d_name,"r");
            yyparse();


        } 

      }

      closedir (dir);
    } 
    else 
    {
      // could not open directory 
      perror ("");
      return EXIT_FAILURE;
    }

1 个答案:

答案 0 :(得分:1)

如果您使用的是flex的合理最新版本,则切换输入文件的方式没有任何问题。但是,如果没有看到更多代码,就无法确定问题是什么。

一个明显的问题是,在调用yyin后,您不会检查fopen的值。如果打开失败(可能会在下面看到),那么yyin将为NULL,当flex尝试阅读时,肯定会产生段错误。

此外,您似乎没有关闭yyin,这会泄漏文件描述符。这应该不是第二个文件的问题,但最终会因缺少文件描述符而导致open失败。

fopen的问题是ent->d_name只是文件的基本名称,没有任何路径。因此fopen将在当前工作目录中搜索该文件。但是,正在读取的目录是./Corpus,这是一个子目录;除非文件在Corpus和主目录之间重复,否则将无法找到该文件。

为了评论员的利益,Flex manual州:

  

如果扫描程序到达文件结尾,则后续调用是未定义的,除非yyin指向新的输入文件(在这种情况下扫描从该文件继续)...基本上只是将yyin分配给a新输入文件或使用yyrestart()来执行此操作;后者可与以前版本的flex兼容,因为它可用于在扫描过程中切换输入文件。

段错误也可能与文件处理无关。最好使用调试器来确定段错误的确切位置。