Изолировать часть памяти, которая будет использоваться только конкретным кодом в переполнении стека

История следующая.
Я играю с генератор парсера / ножки, который имеет превосходный синтаксис для определения грамматик PEG и чрезвычайно прост в использовании. Я был полностью доволен этим, пока не получил таинственные ошибки сгенерированного парсера.
Некоторые исследования выявили проблему в одной из сгенерированных вспомогательных функций:

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

Эта функция всегда звонил со счетом<0.
Использование отрицательного индекса в массиве C — неопределенное поведение. Как я понимаю, память распределяется с помощью peg / leg таким образом, что направление назад от начала массива дает правильный указатель в каком-то другом массиве. На самом деле это очень плохой код, но в большинстве случаев он работает нормально.
Тем не менее, некоторые выделения в других частях моей программы вынуждают разные места для фрагментов памяти и всего, что происходит с ошибками.

Я подозреваю, что проблема вызвана тем фактом, что peg / leg использует malloc, а моя программа использует новый, но я не могу изменить свой код для использования malloc и не могу исправить peg / leg (он сложный и неясный).

Таким образом мне нужно изолировать память, которая используется синтаксическим анализатором от остальной части моей программы, чтобы избежать любых помех.

Есть ли способ сделать это в C ++? Есть ли возможность поместить код парсера в «песочницу»?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]