В настоящее время я использую Valgrind для проверки утечки памяти и использую Purify в качестве альтернативы. Valgrind может обнаружить нарушение прав доступа к массиву, созданному в куче, но не в стеке.
char* a = static_cast<char*>(malloc(sizeof(char) * 5));
a[7] = 'c';
printf("%c\n", a[7]);
free(a);
Valgrind указывает на неправильную запись и чтение в приведенном выше коде, но не в следующем коде.
char a[5] = {0};
a[7] = 'c';
printf("%c\n", a[7]);
Может ли Purify определить нарушение прав доступа к обоим блокам кода?
Согласно руководству пользователя (ftp://ftp.software.ibm.com/software/rational/docs/v2003/purify/html/ht_m_sbr.htm) а также (ftp://ftp.software.ibm.com/software/rational/docs/v2003/purify/html/ht_m_sbw.htm), Purify может обнаружить как чтение, так и запись границы стека.
Однако, проверяя ваши реальные примеры, только нарушение данных кучи было обнаружено и Purify. Я тестировал только последнюю версию от IBM (7.0.1), как для Linux, так и для Solaris.
Вы можете посмотреть на -fsanitize = address для gcc 4.8 и выше.
Других решений пока нет …