Подсчитайте ошибки valgrind, не сообщая о них - PullRequest
0 голосов
/ 06 октября 2019

В настоящее время я поддерживаю пул памяти. Недавно я добавил вызовы функций 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 - что-то подобное существует? Есть ли лучший способ выполнить то, что я хочу сделать?

1 Ответ

1 голос
/ 06 октября 2019

Что вы можете сделать, это использовать клиентский запрос 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 your_program сделает сообщения об ошибках valgrind в / dev / null, а затем your_program может вывести ошибку, если число ошибок не соответствует ожидаемому.

...