从 C 调用 C++ 函数时崩溃

Crash when calling C++ function from C

我有一个从 C 函数调用的 C++ 库函数。该调用传入一个 C 数据结构,该数据结构可由 C++ 代码访问。当访问 C 数据结构时,我的程序在 C++ 代码中崩溃。我已遵循 C++ faq 中有关混合 C-to-C++ 的所有说明。

崩溃发生在centos7机器上。 运行 调试模式下的相同代码不会导致崩溃。 Ubuntu (16.04) 上的相同代码 运行 不会导致崩溃。这是崩溃的 GDB 分析。

(gdb) frame 5
#5  0x00007fc28e79226e in ngx_http_setup_handler (r=0x2469040)
    at /opt/platform/nginx-noname-module.c:201
201       return ModProcessGetApi(r);
(gdb) p r->unparsed_uri
 = {len = 15, data = 0x24572c4 "/__xx/stats/all HTTP/1.1\r\nUser-Agent"}
(gdb) down
#4  0x00007fc28e7945b4 in ModProcessGetApi (r=r@entry=0x2469040)
    at /opt/platform/nginx-body-handler.cc:274
274   ss_rval_t rv = ProcessGetRequest(r, data, &dsize);
(gdb) p r->unparsed_uri
 = {len = 38105792, data = 0xf <Address 0xf out of bounds>}
(gdb)

一进入C++代码,C数据结构就显示地址越界。这是 c-to-c++ 函数的胶水代码。

#if __cplusplus
extern "C" {
#endif

#include <nginx.h>
#include <ngx_core.h>
#include <ngx_log.h>
#include <ngx_http.h>

ngx_int_t ModPostRequestBodyHandler(ngx_http_request_t *r);
ngx_int_t ModProcessGetApi(ngx_http_request_t* r);

#if __cplusplus
}
#endif

如果有人能对此有所说明,我将不胜感激。混合 C 和 C++ 代码时是否需要使用任何编译器选项,以便 C++ 代码可以正确访问 C 数据结构?这是 OS 和编译器信息:

Centos 版本:发生崩溃

OS:Centos 7,C++:g++ 4.8.5

Ubuntu版本:没有发生崩溃。

OS:Ubuntu 16.04,C++:g++ 5.4.0

不确定这是否重要,但我 运行 我的应用程序在两个 OS 上的 docker 容器中。

事实证明,我的 C++ 和 C 库是使用不同的#defines 编译的,因此,两个库中的 C data-structure 是不同的。这会导致 C++ 端的未对齐访问。这个问题也可能发生在两个c库中。

感谢所有回复的人。