数组访问导致空指针取消引用

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);