The FAQ included with version 3.6.1 of the Valgrind source does elaborate a little more:
"possibly lost" means your program is leaking memory, unless you're doing unusual things with pointers that could cause them to point into the middle of an allocated block; see the user manual for some possible causes. Use --show-possibly-lost=no if you don't want to see these reports.
(5.2. Miscellaneous, Valgrind FAQ)
The Valgrind user manual talks about how it keeps track of all heap blocks allocated with malloc/new and describes two ways you can keep track of memory:
- By maintaining a "start-pointer" to the start of the memory block
- By maintaining an "interior-pointer" to some location in the middle of the block
Three situations in which interior-pointers could occur:
- The pointer might have originally been a start-pointer and have been moved along deliberately (or not deliberately) by the program.
- It might be a random junk value in memory, entirely unrelated, just a coincidence.
- It might be a pointer to an array of C++ objects (which possess destructors) allocated with new[].
Possible scenarios:
Pointer chain AAA Category BBB Category
------------- ------------ ------------
(5) RRR ------?-----> BBB (y)DR, (n)DL
(6) RRR ---> AAA -?-> BBB DR (y)IR, (n)DL
(7) RRR -?-> AAA ---> BBB (y)DR, (n)DL (y)IR, (n)IL
(8) RRR -?-> AAA -?-> BBB (y)DR, (n)DL (y,y)IR, (n,y)IL, (_,n)DL
Pointer chain legend:
- RRR: a root set node or DR block
- AAA, BBB: heap blocks
- --->: a start-pointer
- -?->: an interior-pointer
Category legend:
- DR: Directly reachable
- IR: Indirectly reachable
- DL: Directly lost
- IL: Indirectly lost
- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer
- (_)XY: it's XY in either case
(4.2.7. Memory leak detection, Valgrind user manual)
It turns out that the warning "Possibly lost" covers cases 5-8 (for the BBB) block above.
This means that a chain of one or more pointers to the block has been found, but at least one of the pointers is an interior-pointer. This could just be a random value in memory that happens to point into a block, and so you shouldn't consider this ok unless you know you have interior-pointers.
(4.2.7. Memory leak detection, Valgrind user manual)
SO, in a rather long winded way we come to the same conclusion as fbafelipe, that is; assuming you are using the API correctly either sqlite is leaking a little memory or it is engaging in one of the valid cases above. Given the sqlite projects maturity, it is probably safe to assume that the warning isn't much cause for concern.
If you provide more information about how you are using the api (and under what circumstances the leak occurs) other people might be able to provide more insight.
Reference: Valgrind 3.6.1 source, doc/faq.html, doc/mc-manual.html