【发布时间】:2019-03-27 21:27:15
【问题描述】:
我有以下几段代码:(注意:由于我无法共享数据,代码被简化并更改了很多)
exercise.cpp
#include "some_api.h"
extern "C" int extension_init(func_t*, VExtension*);
int main(int argc, char** argv)
{
VExtension ve;
extension_init(&func, &ve);
return 0;
}
some_api.h
bool func(int const& a, void* const& b, VExtension* const& v)
{
std::cout << a << b << std::endl;
}
api.h
typedef int (func_t)(int c, void* p, VExtension* v)
file.cpp
#include "api.h" // this is included implicitly
extern "C" int extension_init(func_t* F, VExtension* v)
{
intptr_t ver = 7;
F(1, (void*)ver, v);
}
因此,当F 被调用时,func 被从some_api.h 调用,但在尝试输出值a 和b 时出现Seg Fault。
静态分析器给出以下错误信息:
ASAN:DEADLYSIGNAL
=================================================================
==15==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000001 (pc 0x55d6dbe48ca2 bp 0x7fff79dbf320 sp 0x7fff79dbf300 T0)
==15==The signal is caused by a READ memory access.
==15==Hint: address points to the zero page.
#0 0x55d6dbe48ca1 in func(int const&, void* const&, VExtension* const&) some_api.h:279
#1 0x55d6dbefe697 in file.cpp:809
#2 0x55d6dbe5373a in main exercise.cpp:123
#3 0x7f9c65393b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#4 0x55d6dbd49839 in _start (//...)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: some_api.h:279 in func(int const&, void* const&, VExtension* const&)
==15==ABORTING
【问题讨论】:
-
投票结束是一个错字。函数签名不匹配。注意
int (func_t)(int c, void* p, VExtension* v)和bool func(int const& a, void* const& b, VExtension* const& v)不是一回事。 -
为什么
some_api.h也为该方法定义了一个实现?这似乎是一个错误。 -
如果这是一个 C 方法,那么你不能使用引用。
-
@NathanOliver 是的,它的工作原理也很奇怪,但是当我适当地更改类型时,我得到了编译错误。
-
@DavidHovsepyan 你能修改代码吗?它会给你什么错误?
标签: c++ c c++11 memory-management bazel