循环崩溃(Android NDK)
我有以下代码(来自我的类成员函数):循环崩溃(Android NDK),android,c++,android-ndk,crashlytics-android,Android,C++,Android Ndk,Crashlytics Android,我有以下代码(来自我的类成员函数): this->mLengOfPath = mFirst->mLengOfPath + mSecond->mLengOfPath; unsigned short* data = mMiddle->mPathContainer; mMiddle->mLengOfPath = 0; for (int index = 0; index < mMiddle->mS
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]);
}
}
this->mLengOfPath=mFirst->mLengOfPath+mSecond->mLengOfPath;
无符号短*数据=mmidle->mPathContainer;
mmidle->mLengOfPath=0;
对于(int index=0;indexmSize;index++){//crash here
如果(索引%2==1&&index>2){
mmidle->mLengOfPath+=
距离(数据[index-3],数据[index-2],
数据[索引-1],数据[索引];
}
}
在大多数情况下,此代码不会崩溃。但是crashlytics告诉我,我的代码“有时”会在第4行崩溃,我不明白为什么。如果mmidle是nullptr,它应该在第2行崩溃(我已经在那里使用了mmidle)
但crashlytics一直报告第4行是问题所在。有人知道我的代码怎么会在第4行出错吗?是的,如果指针无效,它就是UB。但我们在讨论Android NDK和统计工具时,考虑到了特定的平台和编译器。对于本机ARM代码行1、2、4,有时可能会在无效指针上崩溃,只有写入null指针才会100%失败
如果
mmidle
为空,则第3行将始终失败,但如果它是否指向数据段,则可能失败,也可能失败。统计工具将突出显示第4行,因为它是一个更经常执行的行:比较表达式在每次迭代中都进行评估。其他行上的故障可能会成为统计噪声。是否mmidle
始终是有效指针?如果无效,我的代码应该在第2行崩溃,而不是第4行。这就是我不明白的地方。@s.M.它可能不是nullptr,但仍然无效。invlid指针的效果是不可预测的。但一般来说,如果mSize可能通过外部方式更改,那么这种for()可能是不安全的。这就是UB的问题(并且取消对无效指针的引用,null或其他,是UB),所有关于行为的推测都将变得无用。有时它似乎工作得很好,但在下一刻它会崩溃并烧掉。我很确定当for()运行时mmidle->mSize不会改变。它的大小是在此代码运行之前预先计算的。