Как подавить предупреждения valgrind от gpgme?

Я пытаюсь использовать GPGME в своем коде для проверки некоторых подписей. Однако простая инициализация и освобождение контекстов GPGME приводит к тому, что valgrind издает большое количество предупреждений.

Например:

#include <gpgme.h>

int main() {
    gpgme_check_version(NULL);
    gpgme_ctx_t my_ctx;
    gpgme_error_t gpg_err;

    gpg_err = gpgme_new(&my_ctx);

    gpgme_release(my_ctx);

    return 0;
}

Скомпилируйте это с gcc -lgpgme -lassuan -lgpg-error main.c а затем запустить его под Valgrind. От valgrind -v ./a.outВроде бы этот код запускает 6 разных процессов. Я скопировал соответствующие предупреждающие сообщения:

==19158== Warning: invalid file descriptor 1024 in syscall close()
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)
==19158== Warning: invalid file descriptor 1025 in syscall close()
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)
==19158== Warning: invalid file descriptor 1026 in syscall close()
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)
==19158== Warning: invalid file descriptor 1027 in syscall close()
==19158==    Use --log-fd=<number> to select an alternative log fd.
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)
==19158== Warning: invalid file descriptor 1028 in syscall close()
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)
==19158== Warning: invalid file descriptor 1029 in syscall close()
==19158==    at 0x558DBC4: close (in /usr/lib/libc-2.26.so)
==19158==    by 0x4E65DF8: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E66D65: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6736B: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56572: gpgme_get_engine_info (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E56C87: ??? (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x4E6838F: gpgme_new (in /usr/lib/libgpgme.so.11.19.0)
==19158==    by 0x10880B: main (in /home/thedoctor/Programming/gpgmetest/mytest)

Точно такой же набор предупреждений повторяется для 6 различных процессов. Кажется, что GPGME пытается закрыть некоторые файловые дескрипторы, которые не принадлежат.

Мой вопрос двоякий:

  1. Я использую API gpgme неправильно? Есть ли что-то еще, что мне нужно сделать?
  2. Если использование API корректно, как я могу подавить эти предупреждения от valgrind?

Кажется, я не могу заставить Вальгринда производить подавления для этих предупреждений. Бег valgrind --gen-suppressions=all -v ./a.out не показывает никаких подавлений в выводе. Я думаю, это потому, что это предупреждения, а не реальные ошибки. Я пытался написать подавление сам, но я не уверен, какой тип должен быть. Обычно, когда мне приходилось писать подавления, они предназначены для Memcheck:Leak, Но к какой категории относятся эти предупреждения?

РЕДАКТИРОВАТЬ: Вот подавление я попытался написать:

{
    gpgme-leak-fd
    fun:close
    ...
    fun:gpgme_new
}

РЕДАКТИРОВАТЬ 2: Я пытался поставить награду, но срок ее действия истек. Если у вас есть правильный ответ на этот вопрос, я предлагаю вознаграждение в 100 представителей.

1 ответ

Вот некоторые правила для GPGME, написанные Дэном Макги, взятые отсюда:

{
   gpgme-static-get-engine-info
   Memcheck:Leak
   fun:malloc
   ...
   fun:gpgme_get_engine_info
}
{
   gpgme-static-set-engine-info
   Memcheck:Leak
   fun:malloc
   ...
   fun:_gpgme_set_engine_info
   fun:gpgme_set_engine_info
}
{
   gpgme-static-set-locale
   Memcheck:Leak
   fun:malloc
   fun:strdup
   fun:gpgme_set_locale
} 
Другие вопросы по тегам