4

私は現在、非常に奇妙な問題に直面しています。ライブラリを構築し、それを自分のプログラムにリンクしています。すべてがセグメンテーション違反なしで正常に実行されますが (gdb でもチェックされます)、Valgrind でプログラムを実行すると、次のような行が表示されて狂ってしまいます。

==11972== Invalid read of size 8
==11972==    at 0x509509C: setcontext (setcontext.S:73)
==11972==    by 0x509764F: ??? (in /lib/x86_64-linux-gnu/libc-2.15.so)
==11972==  Address 0x541f060 is 128 bytes inside a block of size 936 alloc'd
==11972==    at 0x4C2B3F8: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11972==    by 0x402090: environment_get (env.c:99)
==11972==    by 0x401ED6: environment_new (env.c:36)
==11972==    by 0x40124B: thr_new (thr.c:156)
==11972==    by 0x400EBE: main (itest1.c:31)

しかし、プログラムはsetcontext問題なく実行され、問題なく適切に malloc された引数があります。それらの行について心配する理由はありますか?

ありがとう

4

1 に答える 1

2

スレッドに 7 年遅れて登場しましたが、スタックが少なくともSIGSTKSZ. したがって、次のコードで問題を回避できます。

#include <valgrind/valgrind.h>

//technically, the below doesn't need to be dynamically allocated, but for demonstration:
ucontext_t context = (ucontext_t*) malloc(sizeof(ucontext_t));

getcontext(&context);
void* stack = malloc(SIGSTKSZ);
VALGRIND_STACK_REGISTER(stack, stack + SIGSTKSZ);
context->uc_stack.ss_sp     = stack;
context->uc_stack.ss_size   = SIGSTKSZ;
context->uc_stack.ss_flags  = 0;
sigemptyset(&context->uc_sigmask);
context->uc_link            = &someOtherContextToGoToAfterwards;
makecontext(context, functionForContextToExecute);

次に、それをクリーンアップするときに、次のような責任あることを行うことができます。

VALGRIND_STACK_DEREGISTER(context->uc_stack.ss_sp);
free(context->uc_stack.ss_sp);
free(context).
于 2020-04-15T22:33:41.970 に答える