我正在使用 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
感谢您的观看!