Переполнение счетчика pthread (целое число) в POSIX в valgrind drd_vc.c - PullRequest
1 голос
/ 05 июня 2019

Я использовал «valgrind --tool = drd…» для отладки моей программы на POSIX pthread на C. Valgrind обнаружил ошибку и завершил поток со следующим сообщением об ошибке:

drd: drd_vc.c:96 (vgDrd_vc_increment): Assertion 'oldcount < vc->vc[i].count' failed.

host stacktrace:
==27993==    at 0x38025C68: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x38025D94: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x38025F21: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x38018317: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x380183EC: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x380187FC: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x3801D87E: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x3800967A: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x3803DB80: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x38078BDF: ??? (in /usr/lib64/valgrind/drd-amd64-linux)
==27993==    by 0x3808742A: ??? (in /usr/lib64/valgrind/drd-amd64-linux)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable (lwpid 27993)
==27993==    at 0x4C339D3: pthread_mutex_unlock (in /usr/lib64/valgrind/vgpreload_drd-amd64-linux.so)
==27993==    by 0x47F671: lf_pthread_mutex_unlock (htab2.c:192)
==27993==    by 0x405194: prepare_to_read_n_go (ep3.c:805)
==27993==    by 0x4053C4: reading_begin (ep3.c:847)
==27993==    by 0x405CFF: start_file_loader (ep3.c:1062)
==27993==    by 0x405D4E: start_services (ep3.c:1076)
==27993==    by 0x406743: init_procs (ep3.c:1295)
==27993==    by 0x40336B: main (ep.c:89)

В программеИсходный код, системный вызов "pthread_mutex_unlock" в "lf_pthread_mutex_unlock" был последним оператором, выполненным перед завершением.Я использую OpenSuse, завернутый в «Linux linux 4.4.76-1-default # 1 SMP пт 14 июля 08:48:13 UTC 2017 (9a2885c) x86_64 x86_64 x86_64 GNU / Linux».Компилятор gcc-4.8.

Я нашел исходный код в drd_vc.c:

/** Increment the clock of thread 'tid' in vector clock 'vc'. */
void DRD_(vc_increment)(VectorClock* const vc, DrdThreadId const tid)
{
   unsigned i;
   for (i = 0; i < vc->size; i++)
   {
      if (vc->vc[i].threadid == tid)
      {
         typeof(vc->vc[i].count) const oldcount = vc->vc[i].count;
         vc->vc[i].count++;
         // Check for integer overflow.
         tl_assert(oldcount < vc->vc[i].count);
         return;
      }
   }
   …
} 

, где инструкция "tl_assert (oldcount vc [i] .count);»был переломный момент.

Я не понимаю, что такое семантика счетчика потоков "count" и как он был переполнен моей программой.Моя программа выполняла довольно большой объем данных (миллионы записей).Я изменил свою программу с другим количеством переменных и отметил, что ошибка происходила последовательно.Поэтому я предполагаю, что ошибка не была вызвана перезаписью памяти.

Любая информация о природе исходного кода drd_vc.c будет принята с благодарностью.Спасибо.

...