title: "Conditional jump or move depends on uninitialised value(s)" using ucontext_t
body: <p>I'm running an exercise to simulate threads using contexts. Solved the problem &quot;use of uninitialised value of size 8&quot; but still get the error:</p>
  <pre><code>valgrind ./s --track-origins=yes
  ==7790== Memcheck, a memory error detector
  ==7790== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
  ==7790== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
  ==7790== Command: ./s --track-origins=yes
  ==7790== 
  main: inicio
  ping: inicio
  ping0
  pong: inicio
  pong0
  ping1
  pong1
  ping2
  pong2
  ping3
  pong3
  ping4
  pong4
  ping5
  pong5
  ping6
  pong6
  ping7
  pong7
  ping8
  pong8
  ping9
  pong9
  ping: fim
  pong: fim
  main: fim
  ==7790== Conditional jump or move depends on uninitialised value(s)
  ==7790==    at 0x483C9F5: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
  ==7790==    by 0x10A0A4: SOLUTION::CPU::Context::~Context() (in /home/allan/Documents/Sistemas Operacionais/SO/1_Trabalho/s)
  ==7790==    by 0x10975A: SOLUTION::Main::run() (in /home/allan/Documents/Sistemas Operacionais/SO/1_Trabalho/s)
  ==7790==    by 0x1095AF: main (in /home/allan/Documents/Sistemas Operacionais/SO/1_Trabalho/s)
  ==7790== 
  ==7790== 
  ==7790== HEAP SUMMARY:
  ==7790==     in use at exit: 0 bytes in 0 blocks
  ==7790==   total heap usage: 7 allocs, 7 frees, 204,680 bytes allocated
  ==7790== 
  ==7790== All heap blocks were freed -- no leaks are possible
  ==7790== 
  ==7790== Use --track-origins=yes to see where uninitialised values come from
  ==7790== For lists of detected and suppressed errors, rerun with: -s
  ==7790== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
  
  </code></pre>
  <p>The main code is:</p>
  <pre><code>[...] //not important part, just some cout
          ContextMain = new CPU::Context();
          ping_name = &quot;ping&quot;;
          pong_name = &quot;pong&quot;;
  
          ping = new CPU::Context(func_ping, (char *) ping_name.data());
          pong = new CPU::Context(func_pong, (char *) pong_name.data());
  
          CPU::switch_context(ContextMain, ping) ;
          CPU::switch_context(ContextMain, pong) ;
  
          std::cout &lt;&lt; &quot;main: fim\n&quot;;
  
          delete ContextMain;
          delete ping;
          delete pong;
  </code></pre>
  <p>And the Constructor and Destructor of Context class</p>
  <pre><code>Context(void (* func)(Tn ...), Tn ... an) {
  
                  void *stack;
                  //Setting up _context
                  getcontext(&amp;_context);
  
                  stack = malloc(STACK_SIZE);
  
                  valcontext = VALGRIND_STACK_REGISTER(stack, ((uint8_t*)stack) + STACK_SIZE);
  
                  _context.uc_link            = 0;
                  //_context.uc_stack.ss_sp     = new char [STACK_SIZE]; //Can we use 'new' and 'delete'?
                  _context.uc_stack.ss_sp     = stack; //Can we use 'new' and 'delete'?
                  _stack = (char*) _context.uc_stack.ss_sp;
                  _context.uc_stack.ss_size   = STACK_SIZE;
                  _context.uc_stack.ss_flags  = 0;
  
                  //Attaching func to _context
                  makecontext(&amp;(_context), (void (*) (void))func, sizeof...(an), an ...);
              }
  </code></pre>
  <pre><code>CPU::Context::~Context()
  {
      //delete _context.uc_stack.ss_sp;
      free(_context.uc_stack.ss_sp);
      //delete _stack; ??
      VALGRIND_STACK_DEREGISTER(valcontext);
  }
  </code></pre>
  <p>As i am using an external library (ucontext.h) and cannot initialize the [...].uc_stack.ss_sp, what I could do to solve the error?</p>