2011-08-20 130 views
6

如果我不实际访问解除引用的“对象”,被取消引用空指针仍然不确定?解除引用空指针会成为未定义的行为?

int* p = 0; 
int& r = *p; // undefined? 
int* q = &*p; // undefined? 

一个稍微更实际的例子:我可以解引用空指针来区分重载吗?

void foo(Bar&); 
void foo(Baz&); 

foo(*(Bar*)0); // undefined? 

好的,参考例根据标准绝对未定义的行为:

空引用不能在良好定义的程序存在的,因为只有这样,才能创建这样的参考将它结合到通过取消引用一个空指针,这导致未定义的行为获得的“对象”。

不幸的是,强调部分是模糊的。难道是结合部分导致未定义的行为,或者是解引用部分是否足够?

+0

[这个问题包含你想要的信息。](http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in- undefined-behav) – GManNickG

+0

这必须是一个确切的重复。我知道我们已经讨论过这个问题。 –

回答

2

是的,它是未定义的行为,因为规范说,“左值指定一个对象或函数”(在3.10节),它说*“操作符”“结果[dereferencing]是一个左值指向对象或函数“(在5.3.1节)。

这意味着没有描述当您取消引用空指针时会发生什么。这只是未定义的行为。

+0

(有关SO的其他问题已经讨论过了,所以我想我不再详述)。 –

5
int& r = *p; // undefined? 

我想在这里你已经即使你不确定的行为不实际上使用r(或*p) - 解除引用的对象。因为在这一步之后(即解引用空指针),程序的行为不能被语言保证,因为程序可能立即崩溃,这是UB的一种可能性。您似乎认为仅读取r的值才可以使用 in real目的调用UB。我不这么认为。

此外,语言规范明确指出“解除引用空指针的效果”会调用未定义的行为。它确实是而不是“效果实际上使用从空指针中取消引用的对象”调用UB。解引用空指针(或换句话说未定义的行为)的效果并不意味着您将必然立即出现问题,或者在解引用空指针后立即崩溃。号它只是意味着,该程序行为不是解引用空指针之后定义。也就是说,该程序可能正常运行,符合市场预期,从开始到结束。或者它可能会立即崩溃,或者几分钟,几小时或几天后崩溃。任何事情都可以发生随时解引用空指针。

+0

我无法在标准中找到“解除引用空指针的效果”。你究竟在哪里找到它? – fredoverflow

+1

@FredOverflow:§1.9/ 4(C++ 03)说'某些其他操作在本标准中被描述为未定义的(例如,取消引用空指针的效果)。 [注意:本国际标准对含有未定义行为的程序行为没有要求。 ]' – Nawaz

+0

FDIS用'例如试图修改const对象的效果替换了空指针示例,这可能表示关于解除引用空指针的规则已经改变。 – fredoverflow

4

我认为第二篇作品What every C programmer should know about Undefined Behavior可能有助于说明这个问题。

以博客的例子:

void contains_null_check(int *P) { 
    int dead = *P; 
    if (P == 0) 
    return; 
    *P = 4; 
} 

可能是优化(RNCE:冗余空检查Elimintation):

void contains_null_check_after_RNCE(int *P) { 
    int dead = *P; 
    if (false) // P was dereferenced by this point, so it can't be null 
    return; 
    *P = 4; 
} 

这是周转优化成(DCE:死代码消除) :

void contains_null_check_after_RNCE_and_DCE(int *P) { 
    //int dead = *P; -- dead store 
    //if (false)  -- unreachable branch 
    // return; 
    *P = 4; 
} 

正如你所看到的,即使dead从不使用,简单的int dead = *P赋值导致未定义的行为在程序中蠕变。

为了区分重载,我建议使用一个指针(可以为null),而不是人为地创建一个空引用并将自己暴露给Undefined Behavior。

相关问题