0

故事如下。我正在使用peg/leg 解析器生成器,它具有用于定义 PEG 语法的出色语法,并且非常易于使用。我对此非常满意,直到生成的解析器出现神秘的段错误。一些研究揭示了生成的辅助函数之一中的问题:

YY_LOCAL(void) yySet(yycontext *yy, 
                     char *text, 
                     int count)   
               { yy->__val[count]= yy->__; }

此函数始终在 count<0 时调用。在 C 数组上使用负索引是未定义的行为。据我了解,内存是由 peg/leg 以这样一种方式分配的,即从数组开头向后指向会在其他数组中给出正确的指针。这实际上是非常糟糕的代码,但它在大多数情况下都能正常工作。但是,我的程序其他部分的某些分配会强制将内存块和所有段错误放在不同的位置。

我怀疑问题是由于 peg/leg 使用 malloc 而我的程序使用 new 的事实引起的,但是我无法将代码更改为使用 malloc 并且无法修复 peg/leg(它复杂且晦涩)。

因此,我需要将解析器使用的内存与我的程序的其余部分隔离,以避免任何干扰。

有没有办法在 C++ 中做到这一点?是否有可能将解析器代码放入“沙箱”?

4

0 回答 0