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

My Lex code receiving segmentation fault (core dump) at line *yy_cp = yy_hold_char

这里是从 .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

我有自己问题的答案。下面是对Solution

的一些解释
  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 中

问题就在这里

  1. ... ld:警告:符号“yy_create_buffer”的大小从 libuperbe.a(TYPE1_Lex 中的 318 更改而来。 o) libxxx.a 中的 208 (TYPE2_Lex.o)

ld:警告:符号“yy_load_buffer_state”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 262 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)

中的 146

ld:警告:符号“yy_init_buffer”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 278 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)

中的 164

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

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

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

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

Sed TYPE2_Lex.c 与 :

  • s/yy_create_buffer()/TYPE1_create_buffer/g
  • s/yy_init_buffer()/TYPE1_init_buffer/g
  • s/yy_load_buffer_state()/TYPE1_load_buffer_state/g

Sed TYPE2_Lex.c 与

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

使Loader可以很容易的区分符号。并且在 运行 时,方法名称之间的混淆变为 null

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