У меня есть следующий код (из моей функции члена класса):
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?
Да, это UB, если указатель недействителен. Но мы имеем в виду конкретную платформу и компилятор, пока говорим об Android NDK и статистическом инструменте. При использовании собственных строк кода ARM 1,2,4 строки могут вылетать иногда для недопустимого указателя, только запись в нулевой указатель является ошибкой 100%.
Линия 3 всегда потерпит неудачу, если mMiddle
является нулевым, но может или не может, если он указывает на сегмент данных или нет. Статистический инструмент выделит строку 4, так как она выполняется еще чаще: сравнение выражений выполняется на каждой итерации. Сбои на других линиях могут стать статистическим шумом.
Других решений пока нет …