从C

时间:2018-02-28 18:22:51

标签: c++ c ubuntu centos7 g++4.8

我有一个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
$1 = {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
$2 = {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数据结构?这是操作系统和编译器信息:

Centos版本:发生崩溃

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

Ubuntu版本:崩溃不会发生。

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

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

1 个答案:

答案 0 :(得分:0)

事实证明我的c ++和C库是用不同的#defines编译的,因此,两个库中的C数据结构都不同。这导致c ++端的访问错位。这个问题也可能发生在两个c库中。

感谢所有回复的人。