每个循环都有以下内容,可以将几个guid相互比较。
stringc flanking_id = *flanking_it;
if (abzug) {
if (AppFrame::isValidPointer(&flanking_id)) {
if (AppFrame::isValidPointer(&abzug->guid)) {
if (flanking_id.size() > 0 && abzug->guid.size() > 0) {
if (flanking_id.size() >= abzug->guid.size()) {
if (flanking_id.equalsn(abzug->guid, abzug->guid.size())) {
return bauteil;
}
}
}
}
}
}
abzug-guid是一个core :: stringw,它是一个Irrlicht-Engine数据类型。
isValidPointer调用包含以下两行的方法
BOOL result = somePointer != 0 && somePointer != NULL && somePointer != nullptr && somePointer != nil;
return result;
因此,我的一个指针被破坏是不可能的。但Xcode表示此行中可能存在空指针取消引用。
if (flanking_id.equalsn(abzug->guid, abzug->guid.size())) {
这是警告......
Array access (via field 'array') results in a null pointer dereference (within a call to 'equalsn')
如何解决这个提示?
编辑:irrString.h中的equalsn()by Irrlicht-Engine
bool equalsn(const string<T,TAlloc>& other, u32 n) const
{
u32 i;
for(i=0; i < n && array[i] && other[i]; ++i)
if (array[i] != other[i])
return false;
// if one (or both) of the strings was smaller then they
// are only equal if they have the same length
return (i == n) || (used == other.used);
}
答案 0 :(得分:1)
int * p1 = 0;
int p2 = *p1;
cout << "&p2 != 0: " << (&p2 != 0) << endl;
cout << "*p1 = 1 : " << flush;
*p1 = 1;
cout << "ok" << endl;
输出:
Runtime error time: 0 memory: 3096 signal:11
&p2 != 0: 1
*p1 = 1 :
因此,在取消引用最后一个之后检查有效指针是没用的。它应该是
if (abzug) {
if (AppFrame::isValidPointer(flanking_it)) {
stringc flanking_id = *flanking_it;
//...
关于警告,我不确定Xcode不喜欢什么,但我怀疑这行
for(i=0; i < n && array[i] && other[i]; ++i) // line 1
if (array[i] != other[i]) // line 2
应该在line 1
中检查索引i
是否小于array
的大小。如果n
大于源字符串长度,则会出错。
BTW,您可以使用
代替7个封闭的if-statements
if (!abzug ||
!AppFrame::isValidPointer(&flanking_id) ||
!AppFrame::isValidPointer(&abzug->guid) ||
... {
return ...;
}
if (flanking_id.equalsn(abzug->guid, abzug->guid.size())) {
return bauteil;
}
如果无法使用return
语句,则
do {
if (!abzug ||
!AppFrame::isValidPointer(&flanking_id) ||
!AppFrame::isValidPointer(&abzug->guid) ||
... {
break;
}
if (flanking_id.equalsn(abzug->guid, abzug->guid.size())) {
return bauteil;
}
} while (0);