Я хотел бы попробовать использовать valgrind для обнаружения повреждений кучи. Со следующим "модульным тестом" коррупции:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char * c = (char *) malloc(10) ;
memset( c, 0xAB, 20 ) ;
printf("not aborted\n") ;
return 0 ;
}
Я был удивлен, обнаружив, что valgrind не прекращает работу при ошибке, а просто выдает сообщение:
valgrind -q --leak-check=no a.out ==11097== Invalid write of size 4 ==11097== at 0x40061F: main (in /home/hotellnx94/peeterj/tmp/a.out) ==11097== Address 0x51c6048 is 8 bytes inside a block of size 10 alloc'd ==11097== at 0x4A2058F: malloc (vg_replace_malloc.c:236) ==11097== by 0x400609: main (in /home/hotellnx94/peeterj/tmp/a.out) ... not aborted
Я не вижу опции valgrind для прерывания при ошибке (например, mcheck из gnu-libc, но я не могу использовать mcheck, потому что он не безопасен для потоков). Кто-нибудь знает, возможно ли это (stdout нашего кода dup2 в / dev / null, поскольку он работает как демон, поэтому отчет бесполезен, и я бы предпочел поймать виновного в действии или ближе к нему).