数组访问导致空指针取消引用
Array access results in a null pointer dereference
我对每个循环都有以下内容,它们将几个 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')
如何解决这个提示?
编辑:来自 Irrlicht-EngineirrString.h 的 equalsn()
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);
}
示例 Ideone.com
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
大于源字符串长度,则会出现错误。
顺便说一句,您可以使用
而不是封闭的 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);
我对每个循环都有以下内容,它们将几个 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')
如何解决这个提示?
编辑:来自 Irrlicht-EngineirrString.h 的 equalsn()
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);
}
示例 Ideone.com
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
大于源字符串长度,则会出现错误。
顺便说一句,您可以使用
而不是封闭的 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);