Всё просто у вас ошибка с указателями. Вы куда-то не туда пишете или не то. Найти такие ошибки очень трудно. Я год искал такую! То появлялось то исчезала при этом при попытке локализовать всякий раз появлялась в разных местах.
По мимо указателей следует проверить выход за приделы массива. Обычно тут помогает статистический анализ читайте и исправляйте все wornings. А потом прогоните сторонней тулзой.
Обычно либо забыли "-1" либо где-то лишняя.
Далее пункт два - это дихотомия. Начинаете отключать части программ смотрите исчезает ошибка или появляется. Если отключили верхнюю часть и ошибка исчезла, то ошибка в верхней половине. Если ошибка не исчезла отключаем нижнюю половину программы. Далее берём, ту половину в которой ошибка и её условно делам пополам и снова отключаем половины.
Если не помогло или не получилось переходим к стадии три рефакторингу. Смотрим какие функции сложные:
если функция длине 20 строк то она кандидат на упрощение. Каждое условие надо постараться вынести в отдельную функцию. Циклы тоже в отдельную функцию. Вложенные циклы можно не разбивать если их не более 2-х. Если более 2-х то разбиваем. Пролог, эпилог сократить до 1 строчки.
Простые функции проще проверить и отбросить. Конечный автомат стоит оформить одной функцией, а не разбрасывать по всему коду. Если очень сложный то оформить отдельным модулем.
Как не запутаться в именах? Надо правильно именовать функции как описано у МакКонала в книге «Совершенный код».
После рефакторинга, переходим к следующей стадии добавляем проверки данных по входу.
Если проверка данных по входу не помогает делаем ещё проверку по выходу. Для этого поможет журналирование(logging). Проверяем как свой код так и сторонний в том числе и API.
Следующий этап это фазинг. Фазинг тесно связан с журналированием(logging). Суть фазинга не генерировать такие вектора данных что-бы тест смог заглянуть во-все ветки функций. А журналирование помогает зафиксировать тот вектор на котором программа падает. Так вот я год искал ошибку потому что в одном из условий забыл дописать расчёт указателя функция генерировала мусор и отчасти затирала чужие данные. А в эту функцию программа заходило редка. И проблема была в том что ошибка всплывала не сразу а ещё через миллион процессорных циклов когда шло обращение к данным.