Сбой для цикла (Android NDK)

У меня есть следующий код (из моей функции члена класса):

        this->mLengOfPath = mFirst->mLengOfPath + mSecond->mLengOfPath;
unsigned short* data = mMiddle->mPathContainer;

mMiddle->mLengOfPath = 0;
for (int index = 0; index < mMiddle->mSize; index++) {   //crash here
if (index % 2 == 1 && index > 2){
mMiddle->mLengOfPath +=
GestureUtils::distance(data[index - 3], data[index - 2],
data[index - 1], data[index]);
}
}

В большинстве случаев этот код не падает. Но crashlytics сказал мне, что мой код «иногда» падает в строке 4, что я не понимаю, почему. Если mMiddle равен nullptr, он должен был потерпеть крах в строке 2 (я уже использую mMiddle).

Но crashlytics постоянно сообщает, что проблема в строке 4. Кто-нибудь знает, как мой код может пойти не так в строке 4?

0

Решение

Да, это UB, если указатель недействителен. Но мы имеем в виду конкретную платформу и компилятор, пока говорим об Android NDK и статистическом инструменте. При использовании собственных строк кода ARM 1,2,4 строки могут вылетать иногда для недопустимого указателя, только запись в нулевой указатель является ошибкой 100%.

Линия 3 всегда потерпит неудачу, если mMiddle является нулевым, но может или не может, если он указывает на сегмент данных или нет. Статистический инструмент выделит строку 4, так как она выполняется еще чаще: сравнение выражений выполняется на каждой итерации. Сбои на других линиях могут стать статистическим шумом.

1

Другие решения

Других решений пока нет …