SQLite是否使用SQLCipher扩展泄漏内存?

Ell*_*ron 5 c c++ sqlite memory-leaks sqlcipher

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

此示例产生内存泄漏。如果我取消对的呼叫sqlite3_key,内存泄漏将消失。

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

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

但是,无论我创建了多少连接或使用了多少个不同的加密密钥,内存泄漏始终约为8 KB。这使我怀疑这实际上不是内存泄漏,而只是SQLite / SQLCipher中的某些恒定全局内存,这些内存无法手动释放。

有谁之前经历过这个吗?有办法摆脱泄漏吗?即使这不是官方的内存泄漏,也很难通过此工具检测实际的内存泄漏。

我正在使用WindowsSQLCipher库

小智 3

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

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