我试图在我的代码中使用 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 试图关闭一些不属于自己的文件描述符。
我的问题是双重的:
- 我使用 gpgme API 错了吗?还有什么我需要做的吗?
- 如果 API 的使用是正确的,我该如何抑制来自 valgrind 的这些警告?
我似乎无法让 valgrind 对这些警告产生抑制作用。运行valgrind --gen-suppressions=all -v ./a.out
不会在输出中显示任何抑制。我想这是因为这些是警告而不是真正的错误。我尝试自己写一个抑制,但我不确定应该是什么类型。通常,当我不得不写抑制时,它们是为了Memcheck:Leak
. 但是这些警告属于哪一类呢?
编辑:这是我尝试写的一个抑制:
{
gpgme-leak-fd
fun:close
...
fun:gpgme_new
}
编辑 2:我试图提供赏金,但它已过期。如果你对此有一个有效的答案,我提供 100 代表的赏金。