In
uint8_t s = t - 1;
while (s >= 0 && sortedTasks[s]->NextRelease > Tasks[t].NextRelease )
{
sortedTasks[s+1] = sortedTasks[s]; // shift forward element of target which is greater than param[i]
s--;
}
s не подписано, поэтому s >= 0
всегда истинно, когда t равно 0 s = t - 1
, присваивает s до 255, также когда s равен 0 s--
, присваивает ему значение 255, что дает возможность получить доступ из sortedTasks или разыменовывать еще не инициализированный указатель.
Минимальное изменение, которое следует избегать, - это использование типа со знаком для s и t .
В противном случае необходимо внести дополнительные изменения, например:
Task* sortedTasks[NUMTASKS];
uint8_t t;
sortedTasks[0] = &Tasks[0];
for (t = 1; t < NUMTASKS; ++t)
{
uint8_t s = t - 1;
while (sortedTasks[s]->NextRelease > Tasks[t].NextRelease)
{
sortedTasks[s+1] = sortedTasks[s]; // shift forward element of target which is greater than param[i]
if (s-- == 0)
break;
}
sortedTasks[s+1] = &Tasks[t]; // insert param[i] uint8_to target
}
Обратите внимание, что вы не экономите время, используя uint8_t
или int8_t
вместо unsigned int
или int
, или size_t
и ssize_t
, которые являются «естественными» типами для индексов