話は以下。私はpeg/leg parser generatorで遊んでいます。これは、PEG 文法を定義するための優れた構文を持ち、非常に使いやすいです。生成されたパーサーで不可解なセグメンテーション違反が発生するまで、私はそれに完全に満足していました。一部の調査では、生成されたヘルパー関数の 1 つに問題があることが明らかになりました。
YY_LOCAL(void) yySet(yycontext *yy,
char *text,
int count)
{ yy->__val[count]= yy->__; }
この関数は常にcount<0 で呼び出されます。C 配列で負のインデックスを使用することは、未定義の動作です。私が理解しているように、配列の先頭から後方を指すと、他の配列で正しいポインターが得られるように、メモリがペグ/レッグによって割り当てられます。これは実際には非常に悪いコードですが、ほとんどの場合は問題なく動作します。ただし、プログラムの他の部分での割り当てにより、メモリチャンクとすべてのセグメンテーションフォールトに別の場所が強制されます。
この問題は、peg/leg が malloc を使用し、私のプログラムが new を使用していることが原因であると思われますが、malloc を使用するようにコードを変更できず、peg/leg を修正できません (複雑でわかりにくい)。
したがって、干渉を避けるために、パーサーが使用するメモリをプログラムの残りの部分から分離する必要があります。
C++でこれを行う方法はありますか? パーサーコードを「サンドボックス」に入れる可能性はありますか?