Bison/Lex x86 上的段错误但在 arm 上运行
Bison/Lex segfaults on x86 but runs on arm
我遇到了标题中描述的问题。我有一个 Edify 语言解析器,当我在 arm 上构建它时它运行无误,但当我尝试将它与 x86 一起使用时失败。我将段错误追溯到 yy_scan_bytes 函数,更准确地说是 this code:
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 Installer 源中得到它。
这就是我在调试后发现的一切。谢谢
尝试构建您的代码时出现以下错误:
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()
return 一个 int
,就像它对所有未在使用前声明的函数所做的那样(根据c89 标准)。但事实并非如此(第一个 returns void
,第二个指针 (YY_BUFFER_STATE
))。请注意,在 x86_64 上,指针的大小 而不是 与 int
.
的大小相同
添加一些 band-aid 原型,例如
void yy_switch_to_buffer(void*);
void *yy_scan_string(const char*);
到 main.c
,在 parse_string()
中使用它们之前可能会停止段错误。
更好的解决方法是在 Makefile 中安排词法分析器 运行 和 --header-file=lex-header.h
选项,然后包含 main.c
中的 lex-header.h
。或者更好的是,将所有 lex-specific 代码包装在一些简单的函数中,并将这些函数的原型放在 main.c
和 *.l
文件中包含的 header 中。
我遇到了标题中描述的问题。我有一个 Edify 语言解析器,当我在 arm 上构建它时它运行无误,但当我尝试将它与 x86 一起使用时失败。我将段错误追溯到 yy_scan_bytes 函数,更准确地说是 this code:
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 Installer 源中得到它。 这就是我在调试后发现的一切。谢谢
尝试构建您的代码时出现以下错误:
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()
return 一个 int
,就像它对所有未在使用前声明的函数所做的那样(根据c89 标准)。但事实并非如此(第一个 returns void
,第二个指针 (YY_BUFFER_STATE
))。请注意,在 x86_64 上,指针的大小 而不是 与 int
.
添加一些 band-aid 原型,例如
void yy_switch_to_buffer(void*);
void *yy_scan_string(const char*);
到 main.c
,在 parse_string()
中使用它们之前可能会停止段错误。
更好的解决方法是在 Makefile 中安排词法分析器 运行 和 --header-file=lex-header.h
选项,然后包含 main.c
中的 lex-header.h
。或者更好的是,将所有 lex-specific 代码包装在一些简单的函数中,并将这些函数的原型放在 main.c
和 *.l
文件中包含的 header 中。