故事如下。 我正在使用peg/leg parser generator,它具有用于定义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 ++中这样做?是否有可能将解析器代码放入"沙箱"?