LINUX.ORG.RU

Не ясна причина утечки памяти

 ,


0

2

SUMMARY: AddressSanitizer: 350261968 byte(s) leaked in 487181 allocation(s)

Везде где есть prepare или step оно считает за утечку. А в процессах действительно видно как идет зажор памяти:

int db_query(void *db, char *query)
{
	sqlsdb_state *state = (sqlsdb_state*) db;
	sqlite3_stmt *stmt = NULL;
	int rc;

	rc = sqlite3_prepare_v2(state->sqlite, query, -1, &stmt, NULL);
	if(rc != SQLITE_OK) return rc;
	rc = sqlite3_step(stmt);
	sqlite3_finalize(stmt);
	return rc;
}
Если sqlite3_prepare_v2 не вернул SQLITE_OK, то должен ли я вызывать sqlite3_finalize? Так вот утечка сохраняется, несмотря на то что всегда там SQLITE_OK

Пробовал и с бибилиотекой из состава Ubuntu 18.04, так и с https://www.sqlite.org/2019/sqlite-amalgamation-3290000.zip прямо подключенного к проекту, чтобы яснее видеть отладочные символы и места утечек - результат один

Иногда еще показывает на sqlite3_open_v2 как место утечки, хотя close_v2 нормально вызывается

ЧЯДНТ?

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Мимокрокодил, но вообще если ошибка произошла, то вызывать `sqlite3_finalize` не нужно, хотя бы потому, что в случае ошибки stmt равно NULL (можно проверить, кстати), а `sqlite3_finalize` требует чтобы он был отличный от NULL.

yetanother ★★
()

Можешь оформить минимальный кейс, на котором проблема проявляется?

SoulThreads
()

Может надо вызвать еще sqlite3_close?

Nibbler
()
Ответ на: комментарий от deep-purple

Использую AddressSanitizer и прочие плагины GCC. Валгриндом тоже прогонял, он тоже самое показывает.

Хотел сначала проблемный код показать, нашел самую малую по объему проблемную функцию у себя, может я совершил невероятно тупую ошибку. Но никто вроде не говорит что нечто неверно

Буду завтра закапываться в это. Течет именно на Linux, но смешно - в QNX 4.25 такой проблемы нет! Странно это

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Nereus

За ссылки спасибо. К сожалению нет, выясняю дальше

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от beastie

Ну это не противоречит моему утверждению, но дополняет его - вызывать `sqlite3_finalize()` не нужно в случае ошибки, но если вызовете - это не приведет ни к каким последствиям.

yetanother ★★
()

Прочитав доки к этим функциям найти утечку в приведённом коде не смог. А что говорит valgrind? Есть несколько версий - баг в этом address sanitizer, баг в самой либе, хотя это маловероятно.

mxfm ★★
()
Ответ на: комментарий от mxfm

Я пробовал и AS и Valgrind. Оба показывали факты утечки памяти.

Но мне удалось найти отсутствие sqlite3_finalize(stmt) в том месте, куда AS/Vg прямо не показывали, а рядом. Просто одно место утечки порождало ураган ложных или вторичных событий, в которых трудно было разобраться.

Проблема решена. Причина была в отсутствии sqlite3_finalize. По порядку каждое сообщение проверил внимательно и удалось увидеть место проблемы.

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.