c++ - "free(): invalid pointer"在发布版本 (O3) 上调用 "libucis.so"时,我的代码从未到达

标签 c++

我正在从事一个大型项目并做出了相对较小的贡献:一个由 C 代码调用的 C++ 新类。将我的贡献添加到项目中后,我发现调试构建完美无缺,而发布构建仅在约 30 个测试用例(总共 20k+)上失败,其中调用了“libucis.so”的某些函数。同一代码库的调试和发布版本中的“valgrind”令人惊讶地显示出不同之处:在调试版本中没有发现无效访问,而发布版本就是这种情况。一些典型的 valgrind 错误如下:

==220335== Invalid free() / delete / delete[] / realloc()
==220335==    at 0x508D17D: operator delete(void*) (vg_replace_malloc.c:576)
==220335==    by 0x5588587: _M_dispose (basic_string.h:2765)
==220335==    by 0x5588587: std::string::_M_mutate(unsigned long, unsigned long, unsigned long) (basic_string.tcc:927)
==220335==    by 0x5588A4D: std::string::_M_replace_safe(unsigned long, unsigned long, char const*, unsigned long) (basic_string.tcc:1124)
*****some functions of libucsi.so not shown*****

==220335== Invalid free() / delete / delete[] / realloc()
==220335==    at 0x508D17D: operator delete(void*) (vg_replace_malloc.c:576)
==220335==    by 0x5589004: _M_dispose (basic_string.h:2765)
==220335==    by 0x5589004: std::string::reserve(unsigned long) (basic_string.tcc:951)
*****some functions of libucsi.so not shown*****

此外,我确认我的代码(C 包装器中的类方法)从未在所有报告上述类似错误的失败测试用例中被调用。而所有的valgrind invaid access错误都发生在STL中的basic_string类上。

关于我的类(class):SQLite 数据库编写器。包括 vector 和字符串标题。

我已经进行了广泛的在线或离线搜索...如果能提供一些提示,我们将不胜感激。

最佳答案

问题终于解决了。以下是调查和解决方案的摘要。

一来二去,我决定空着手测试我的类:只保留空定义和必要返回的函数成员,注释掉所有“冗余”的东西。成功通过了所有剩余的 ~30 个测试用例。然后我逐渐取消注释我的代码,最终我发现每当我使用 std::string 时都会发生错误,即使使用像“std::string s;”这样的单个声明也是如此。基于进一步的搜索,我认为问题是由于“libucis.so”是用不同版本的 stdc++ 编译的。而且我知道 libucis.so 不是我们编译的,而是由第三方提供的。然后我回到我的 makefile,并丢弃所有不必要的库/ header 搜索路径。结果是编译我的代码的字符数从 ~5000 减少到只有 281。逐步重建整个项目,问题解决了。呸……

更新:根本原因可能与上面的讨论有所不同。最终我发现用 -fPIC 编译我的 C++11 代码解决了这个问题。但问题是目标中包含的其他 C 代码未使用 -fPIC 编译...那么为什么我的 C++11 代码是唯一需要使用 -fPIC 选项编译的人,而不是其余的(20+ 源代码文件)C 代码?

关于c++ - "free(): invalid pointer"在发布版本 (O3) 上调用 "libucis.so"时,我的代码从未到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356864/

相关文章:

c++ - 当多个指针指向一个对象时删除它?

c++ - 如何打印 ;使用 CMake 命令的符号?

c++ - 如何在C/C++中保存数据?

c++ - 将只有插槽的 QGLWidget 移动到不同的线程

c++ - 如何从基类 vector 到达派生类变量?

c++ - 不能调用没有对象的成员函数。 C++

c++ - 试图在我的 if 语句中找到错误

java - 继承和聚合 UML

javascript - 如何在 node.js AddOn 中访问 Local<String>

安卓NDK游戏引擎