如何抑制gpgme的valgrind警告?

时间:2018-02-09 19:07:57

标签: c 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. 我使用gpgme API是错误的吗?我还需要做些什么吗?
  2. 如果API的使用是正确的,我如何从valgrind中抑制这些警告?
  3. 我似乎无法让valgrind对这些警告产生抑制。正在运行valgrind --gen-suppressions=all -v ./a.out并未显示输出中的任何抑制。我猜这是因为这些是警告,而不是真正的错误。我自己试着写一个抑制,但我不确定这个类型应该是什么。通常,当我不得不写抑制时,它们是Memcheck:Leak。但这些警告属于哪个类别?

    编辑:这是我试图写的一个抑制:

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

    编辑2:我试图提出赏金,但它已经过期了。如果你有一个有效的答案,我会提供100个代表的赏金。

1 个答案:

答案 0 :(得分:0)

以下是Dan McGee编写的GPGME规则,取自here

{
   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
}