x86上的Bison / Lex segfaults但在手臂上运行

时间:2018-09-24 23:45:58

标签: c bison cpu-architecture lex

我在标题中描述了一个问题。我有一个Edify语言解析器,当我在手臂上构建它时运行时没有错误,但是当我尝试将其与x86一起使用时失败。我将segfault跟踪到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来源获得它。 这是我在调试后发现的所有内容。谢谢。

1 个答案:

答案 0 :(得分:1)

尝试构建代码会给我这些错误:

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文件中包含的标头中。