5

我正在使用SQLCipher存储加密的SQLite数据库。但是,当我使用sqlite3_key加密数据库时,我开始出现内存泄漏。观察以下示例:

#include <sqlite3.h>    

int main()
{
    sqlite3 * connection;
    sqlite3_open_v2(":memory:", &connection, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    sqlite3_key(connection, "passphrase", 10);
    sqlite3_close(connection);
}

此示例产生内存泄漏。如果我删除对 的调用sqlite3_key,内存泄漏就会消失。

我已经缩小了一些可能的罪魁祸首:

  • 尽管该示例使用内存数据库(因此":memory:"),但在使用基于文件的数据库时,我看到了相同的结果。
  • sqlite3_*调用的所有返回码都是SQLITE_OK,这意味着没有任何错误。
  • 10for的缓冲区长度"passphrase"不是问题。

但是,无论我创建多少连接或使用多少不同的加密密钥,内存泄漏总是大约 8 KB。这让我怀疑这实际上不是内存泄漏,而只是 SQLite/SQLCipher 中的一些不变的全局内存,不会手动释放。

有谁之前经历过这个吗?有没有办法摆脱泄漏?即使这不是官方的内存泄漏,也很难用这个礼物检测到真正的内存泄漏。

我正在为 Windows 使用 SQLCipher 库

4

1 回答 1

2

我对此进行了更深入的研究,这些报告的泄漏是由 OpenSSL 分配的内存造成的。由于 SQLCipher 不知道应用程序何时严格使用它,EVP_cleanup()因此不会调用它,并且 valgrind 将内存报告为泄漏。我们正在努力进行一个简单的修复,该修复将尝试通过一些简单的引用计数来识别 SQLCipher 何时不再使用 OpenSSL 结构,因此EVP_cleanup()可以自动调用。

作为 SQLCipher 下一个版本之前的快速解决方法,您可以EVP_cleanup()在退出之前在程序中手动调用。

于 2012-10-02T15:58:36.010 回答