2012-08-02 52 views
4

我使用SQLCipher來存儲加密的SQLite數據庫。但是,當我使用sqlite3_key加密數據庫時,我開始發生內存泄漏。遵守以下樣品:SQLite是否會使用SQLCipher擴展泄漏內存?

#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,表示沒有任何錯誤。
  • 緩衝區長度爲10"passphrase"不是問題所在。

但是,無論我創建多少個連接或使用多少個不同的加密密鑰,內存泄漏總是大約8千字節。這讓我懷疑這實際上不是內存泄漏,而是SQLite/SQLCipher中的一些常量全局內存不能手動釋放。

有沒有人遇到過這個?有沒有辦法擺脫泄漏?即使這不是官方的內存泄漏,也很難用這個禮物來檢測真正的內存泄漏。我正在使用SQLCipher library for Windows

+0

你是如何檢測內存泄漏的? _CrtDumpMemoryLeaks()? – 2012-08-02 19:59:33

+0

是的,在Boost單元測試框架內。 – 2012-08-02 20:02:13

+0

在運行最新的repo代碼的Linux上,上述代碼沒有問題。 – netcoder 2012-08-02 20:16:30

回答

2

我已經研究了這一點,並且這些報告的泄漏是由OpenSSL分配的內存的結果。由於SQLCipher不知道應用程序嚴格使用它的時間,因此EVP_cleanup()未被調用,並且valgrind將內存報告爲泄漏。我們正在努力尋找一種簡單的修復方法,它將嘗試通過一些簡單的引用計數來識別SQLCipher不再使用OpenSSL結構,因此可以自動調用EVP_cleanup()

作爲在下一版SQLCipher之前的快速解決方法,您可以在退出之前在程序中手動調用EVP_cleanup()