Считать ошибки valgrind, не сообщая о них

В настоящее время я поддерживаю пул памяти. Недавно я добавил вызовы функций valgrind в этот пул, чтобы сделать его более полезным для обнаружения ошибок valgrind, возникающих при использовании указанного пула. Что я хочу сделать с этим, так это написать модульный тест, чтобы проверить, правильно ли работают мои вызовы функций valgrind. Например.,

int main(void)
{
  int * test = pool_malloc(sizeof(*test)); // details not important
  *test = 3;
  pool_free(test); // details not important

  if (*test == 2)
  {
    printf("HERE");
  }

  assert(VALGRIND_COUNT_ERRORS == 1);
}

Этот код теперь правильно дает мне недопустимую ошибку чтения, тогда как раньше этого не было, поскольку даже если память была возвращена в пул, на самом деле это не было free-d. Однако я не могу использовать именно этот код, поскольку наша среда модульного тестирования предполагает, что любые ошибки valgrind означают, что тест не пройден, и поэтому мой вышеприведенный тест не пройден. Я пытался использовать VALGRIND_DISABLE_ERROR_REPORTING, но это также, по-видимому, отключает не только отчетность, но и проверку на наличие ошибок, то есть VALGRIND_COUNT_ERRORS теперь возвращает 0. Что мне действительно нужно, так это что-то вроде VALGRIND_DISABLE_ERROR_REPORTING_BUT_KEEP_COUNTING_ERRORS_THAT_OCCUR - существует ли что-то подобное? Есть ли лучший способ выполнить то, что я хочу сделать?


person R_Kapp    schedule 06.10.2019    source источник


Ответы (1)


Что вы можете сделать, так это использовать запрос клиента valgrind VALGRIND_COUNT_ERRORS.

valgrind.h среди прочего говорит:

    ...
             /* Can be useful in regression testing suites -- eg. can
                 send Valgrind's output to /dev/null and still count
                 errors. */
              VG_USERREQ__COUNT_ERRORS = 0x1201,
    ...
    /* Counts the number of errors that have been recorded by a tool.  Nb:
       the tool must record the errors with VG_(maybe_record_error)() or
       VG_(unique_error)() for them to be counted. */

Таким образом, что-то вроде: valgrind --log-file=/dev/null ваша_программа сделает сообщения об ошибках valgrind в /dev/null, и ваша_программа может затем вывести ошибку, если количество ошибок не соответствует ожидаемому.

person phd    schedule 06.10.2019