我的Lex代码在行* yy_cp = yy_hold_char接收分段错误(核心转储)

时间:2015-01-17 12:03:35

标签: parsing segmentation-fault yacc lex coredump

这里是.Lex生成的.c代码片段 Coredump即将进行第一次迭代

while (1)   /* loops until end-of-file is reached */{
   yy_cp = yy_c_buf_p;

    /* Support of yytext. */
    *yy_cp = yy_hold_char;   // receiving coredump here

    /* yy_bp points to the position in yy_ch_buf of the start of
     * the current run.*/

     yy_bp = yy_cp;
     yy_current_state = yy_start;}

Here you can find code

1 个答案:

答案 0 :(得分:1)

我已经回答了我自己的问题。以下是解决方案的一些解释

  1. 我有两个.Lex(Type1_Lex.l& Type2_Lex.l)和两个.Yacc(Type1_Yacc.y& Type2_Yacc.y)代码
  2. 我正在编译所有相关的.c(Type1_Lex.c,Type2_Lex.c,Type1_Yacc.c& Type2_Yacc.v)和.h文件正在生成
  3. 进一步编译.c,生成Type1_Lex.o,Type2_Lex.o,Type1_Yacc.o Type2_Yacc.o
  4. 此外,我将所有这些目标文件放在一个.a
  5. 问题在这里

    1. ... ld:警告:符号“ yy_create_buffer ”的大小从libuperbe.a( TYPE1_Lex .o)中的318更改为libxxx.a中的208( TYPE2_Lex 的.o)
    2. ld:警告:符号“ yy_load_buffer_state ”的大小从libuperbe.a中的262( TYPE1_Lex .o)更改为libxxx.a中的146( TYPE2_Lex 的.o)

      ld:警告:符号“ yy_init_buffer ”的大小从libuperbe.a中的278( TYPE1_Lex .o)更改为libxxx.a中的164( TYPE2_Lex 的.o)

      生成的.c(TYPE1_Lex.c& TYPE2_Lex.c)中的某些符号相同

      • 当两个目标文件绑定在单个.a中时类似 (yy_create_buffer,yy_init_buffer,yy_load_buffer_state)符号得到了 的覆盖

      • 在运行时,应该调用TYPE2_Lex.c 中定义的方法yy_create_buffer(),yy_init_buffer(),yy_load_buffer_state(),但实际上这些方法是从TYPE1_Lex.c文件调用的和导致内存损坏的一些方法。

      • 为了继续前进,我决定使用 sed 以下模式:

      Sed TYPE2_Lex.c with:

      • S / yy_create_buffer()/ TYPE1_create_buffer /克
      • S / yy_init_buffer()/ TYPE1_init_buffer /克
      • S / yy_load_buffer_state()/ TYPE1_load_buffer_state /克

      Sed TYPE2_Lex.c with

      • s / yy_create_buffer()/ TYPE2_create_buffer / g
      • S / yy_init_buffer()/ TYPE2_init_buffer /克
      • S / yy_load_buffer_state()/ TYPE2_load_buffer_state /克

      这样Loader可以轻松区分符号。并且在运行时方法名称之间的混淆变为空

      在完成所有这些步骤后,我能够继续前进:) 感谢大家的帮助:)