在C中实现无效安全吗?

时间:2015-01-19 07:02:52

标签: c void

根据Wikipedia

  

虚拟安全性是面向对象编程中的保证   语言没有对象引用将具有null或void值

这一切都很好,但是C不是面向对象的PL,并且该定义仅适用于空指针的derefencing或对象实例的引用。

那么,C中是否存在无效安全性?该术语(或其相反的术语)是否适用于描述语言?

3 个答案:

答案 0 :(得分:6)

没有。但是,如果使用指针,C ++(面向对象编程语言之一)也不存在。 C ++ 引用是应该始终引用真实对象的东西,指针在C和C ++中都可以是NULL。您可能能够获取悬挂在C ++中的引用,但是,作为未定义的行为,您已经违反规则并且所有赌注都已关闭。

C本身 没有引用,只有指针,你根本没有达到这种保护级别,除非你亲自手动完成:

if (ptr != NULL)
    doSomethingWith (*ptr);

在C中,代码如下:

char *xyzzy = NULL;
char plugh = *xyzzy;

只是询问是否有问题,但编译器不会阻止你这样做,因为它完全合法(但是,对于C ++情况,未定义的行为)。

答案 1 :(得分:0)

C中没有NULL安全性.C中没有引用,只是指针。指针可以设置为NULL,并且解析NULL ptr会导致分段错误,如下所示:

int main(int argc, char **argv) {
    int val = 5555;
    int val2 = 555;


    int *ptr;

    ptr = &val; /* ptr now points to the address of val */

    printf("Address: 0x%.8x [0x%.8x]", &ptr, &val);

    printf("\nAddress: 0x%.8x [0x%.8x]", ptr, &val);

    printf("\nValue: %d [%d]", *ptr, val);  



    ptr = &val2;

    printf("\n\n\nNew Address: 0x%.8x [0x%.8x]", &ptr, &val2);

    printf("\nNew Address: 0x%.8x [0x%.8x]", ptr, &val2);

    printf("\nNew Value: %d [%d]\n\n", *ptr, val2);


    ptr = NULL;

    printf("\nptr = %d", ptr);

    printf("\n&ptr = 0x%.8x", &ptr);

    // printf("\n*ptr = %d", *ptr); /* causes segfault */

    return 0;
}

char @ char:〜$ ./a.out

地址:0xf8638e50 [0xf8638e5c]

地址:0xf8638e5c [0xf8638e5c]

价值:5555 [5555]

新地址:0xf8638e50 [0xf8638e58]

新地址:0xf8638e58 [0xf8638e58]

新值:555 [555]

ptr = 0

& ptr = 0xf8638e50


但如果你取消注释最后一次调用printf,你会得到:


char @ char:〜$ ./a.out

地址:0xfbb6cae0 [0xfbb6caec]

地址:0xfbb6caec [0xfbb6caec]

价值:5555 [5555]

新地址:0xfbb6cae0 [0xfbb6cae8]

新地址:0xfbb6cae8 [0xfbb6cae8]

新值:555 [555]

ptr = 0

分段错误

答案 2 :(得分:0)

当没有对象引用时(例如在C中),很容易保证没有对象引用具有null或void值。

说C具有无效安全性是正确的,但它也没有意义。有关详细信息,请参阅:http://en.wikipedia.org/wiki/Vacuous_truth