Segfaults Bison / Lex на x86, но работает на руку - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть проблема, описанная в названии.У меня есть синтаксический анализатор языка Edify, который работает без ошибок, когда я собираю его на руку, но не удается, когда я пытаюсь использовать его с x86.Я проследил segfault до функции yy_scan_bytes, точнее до этого кода :

YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len ) {
YY_BUFFER_STATE b;
char * buf;
yy_size_t n;
int i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
buf = (char *) yyalloc(n  );

if ( ! buf ) {
  YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
}

for ( i = 0; i < _yybytes_len; ++i ) {
  buf[i] = yybytes[i]; // <==========
}

Полный код здесь: https://github.com/twaik/edify_x86_failing_code Я получил его из источника установщика AROMA.Это все, что я обнаружил после отладки.Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Попытка построить ваш код дает мне следующие ошибки:

main.c: In function ‘parse_string’:
main.c:27:5: warning: implicit declaration of function ‘yy_switch_to_buffer’ [-W
implicit-function-declaration]
     yy_switch_to_buffer(yy_scan_string(str));
     ^~~~~~~~~~~~~~~~~~~
main.c:27:25: warning: implicit declaration of function ‘yy_scan_string’ [-Wimplicit-function-declaration]
     yy_switch_to_buffer(yy_scan_string(str));

Это означает, что компилятор предполагает, что yy_switch_to_buffer() и yy_scan_string() возвращают int, так какделает для всех функций, которые не объявлены перед использованием (согласно стандарту c89).Но это не так (первый возвращает void, а второй - указатель (YY_BUFFER_STATE)).Обратите внимание, что в x86_64 размер указателя не совпадает с размером int.

Добавление некоторых прототипов пластыря, таких как

void yy_switch_to_buffer(void*);
void *yy_scan_string(const char*);

до main.c, прежде чем их использование в parse_string() может остановить сегфагинг.

Лучшим решением было бы организовать в Makefile запуск лексера с опцией --header-file=lex-header.h, а затем включить lex-header.h от main.c.Или, что еще лучше, оберните весь специфичный для lex код в несколько простых функций и поместите прототипы этих функций в заголовок, включенный как в файл main.c, так и в файл *.l.

...