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

时间:2015-02-17 13:23:34

标签: c++ arrays xcode null

每个循环都有以下内容,可以将几个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);
}

1 个答案:

答案 0 :(得分:1)

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大于源字符串长度,则会出错。

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