c - x86 上的 Bison/Lex 段错误,但在 arm 上运行
问题描述
我有一个标题中描述的问题。我有一个 Edify 语言解析器,当我在 arm 上构建它时运行没有错误,但当我尝试将它与 x86 一起使用时失败。我将段错误追踪到 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 安装程序源获得它。这就是我调试后发现的一切。谢谢。
解决方案
尝试构建您的代码会给我这些错误:
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
from main.c
. 或者更好的是,将所有 lex 特定的代码包装在一些简单的函数中,并将这些函数的原型放在文件main.c
和文件中包含的头*.l
文件中。
推荐阅读
- spring-boot - 从 Spring Boot 应用程序调用 SOAP Web 服务的最佳方法/最新方法
- javascript - 嵌套可观察对象和以角度加载内容的问题
- sql-server - Microsoft SQL Server Management Studio 未显示要编辑的前 200 行
- javascript - JavaScript 异步函数执行顺序
- javascript - 使用 mongoose 连接到 mongoDB 的未处理的承诺拒绝警告
- r - 如何使用 n 为类别创建 tibble
- ibm-watson - Watson Studio 无法通过添加新存储来创建空项目
- spring - 为什么此处理程序方法(/trying)返回错误 404 而不是将请求发送到另一个处理程序方法 /addpage
- asp.net-mvc - 身份验证 Cookie 在第 3 方 iframe 中不起作用
- php - 使用 php 在 GitLab 中上传文件时遇到问题