I updated to the latest valgrind from svn, and it gives lots of nifty new warnings. e.g. it warns if you are using the wrong free for a particular memory block, and it tells you where uninitialized blocks came from.
http://kegel.com/wine/valgrind/logs-2008-05-25-summary.txt is a roadmap of where the sexy new stuff is; the details are in http://kegel.com/wine/valgrind/logs-2008-05-25/
For instance, it says
diff -u logs-2008-05-20/vg-winmm_capture.txt logs-2008-05-25/vg-winmm_capture.txt + Uninitialised value was created by a client request + Mismatched free() / delete / delete []
Pulling up just that diff, http://kegel.com/wine/valgrind/logs-2008-05-25/vg-winmm_capture-diff.txt shows the latter error is + Mismatched free() / delete / delete [] + at RtlFreeHeap (heap.c:1287) + by wave_in_test_device (capture.c:397) + by func_capture (capture.c:716) + by run_test (test.h:414) + by main (test.h:463) + Address 0x440cc90 is 0 bytes inside a block of size 14 alloc'd + at malloc (vg_replace_malloc.c:207) + by wave_in_test_device (capture.c:388) + by func_capture (capture.c:716) + by run_test (test.h:414) + by main (test.h:463)
Sure enough, memory is allocate with strdup() and freed with HeapFree(), tsk.
Anyway, there's plenty here for everybody. Pile on!
Tomorrow I'll start running these without -O2; Zac Brown reminded me that gives better stack tracebacks (i.e. it inhibits inlining, which often causes small static functions to disappear from the stack dumps in valgrind's error messages). - Dan