If you're allocating memory dynamically your programs are probably already too complex for it to do a really good job, but you may be amused by the value analysis in Frama-C. Take a look at the tutorialet and move up to the tutorial chapter in the manual if you are still interested.

Valgrind catches a lot of memory errors. It misses a variety, too, such as access outside of a local array. Our CheckPointer tool will catch virtually all types of bad memory references at the moment the error is made. See the comparison table at the web page to see more things Valgrind won't catch that CheckPointer will.