如何在 Bison 中释放 yyptr 堆栈?

问题描述 投票:0回答:0

我正在使用 Bison 生成解析器,词法分析器是用 Ragel 编写的。当我用 Valgrind 运行我的代码时,它给我这个输出:

200,014 bytes in 2 blocks are definitely lost in loss record 139,468 of 139,600
  malloc (vg_replace_malloc.c:393)
 *yyparse (parser.c:1768)
 *GraphQL_CParser_Parser_c_parse (graphql_c_parser_ext.c:8)
  vm_call_cfunc_with_frame (vm_insnhelper.c:3268)
  vm_sendish (vm_insnhelper.c:5080)
  vm_exec_core (insns.def:820)
  rb_vm_exec (vm.c:2374)
  ...

(还有更多——我正在从 Ruby 调用解析器。完整的构建输出现在可以在这里获得:https://github.com/rmosolgo/graphql-ruby/actions/runs/4556195698/工作/8036241668?pr=4410)

它指向我的(生成的)yyparse 函数,代码如下:

# else /* defined YYSTACK_RELOCATE */
      /* Extend the stack our own way.  */
      if (YYMAXDEPTH <= yystacksize)
        YYNOMEM;
      yystacksize *= 2;
      if (YYMAXDEPTH < yystacksize)
        yystacksize = YYMAXDEPTH;

      {
        yy_state_t *yyss1 = yyss;
        union yyalloc *yyptr =
          YY_CAST (union yyalloc *,
                   YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
        if (! yyptr)
          YYNOMEM;
        YYSTACK_RELOCATE (yyss_alloc, yyss);
        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
#  undef YYSTACK_RELOCATE
        if (yyss1 != yyssa)
          YYSTACK_FREE (yyss1);
      }

如何解决来自 Valgrind 的错误消息?我不确定这是否是合法的内存泄漏,我应该找到一种方法来释放分配的内存,或者它是否是误报,我应该禁止显示此消息。

我能做些什么来进一步调试吗?

此处生成的整个 C 解析器,以防有帮助:https://github.com/rmosolgo/graphql-ruby/blob/a048682e6d8468d16947ee1c80946dd23c5d91f9/graphql-c_parser/ext/graphql_c_parser_ext/parser.c

这里有 Bison 定义:https://github.com/rmosolgo/graphql-ruby/blob/a048682e6d8468d16947ee1c80946dd23c5d91f9/graphql-c_parser/ext/graphql_c_parser_ext/parser.y

感谢您的观看!

c ruby valgrind bison ragel
© www.soinside.com 2019 - 2024. All rights reserved.