如何解决警告“编译器可以假设'object'的地址永远不会为NULL”

lei*_*iyc 1 c++ gcc-warning

我使用gcc8编译以下代码:

#include <iostream>

class person
{
    public:
        virtual void setage()=0;
};

void test(person &object)
{
    if (&object == NULL) {
        std::cout << "NULL object1" << std::endl;
    }

    if (!(&object)) 
    {
        std::cout << "NULL object1" << std::endl;
    }
}

int main()
{
    person *object=NULL;
    person &object1=*object;

    test(object1);
}
Run Code Online (Sandbox Code Playgroud)

然后,在编译并运行后会出现两个警告:

$ g ++ -std = c ++ 14 -pthread -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc ++ fs && ./a.out

main.cpp:在函数“ void test(person&)”中:

main.cpp:11:17:警告:编译器可以假定“对象”的地址永远不会为NULL [-Waddress]

 if (&object == NULL) {

             ^
Run Code Online (Sandbox Code Playgroud)

main.cpp:15:18:警告:编译器可以假定“对象”的地址永远不会为NULL [-Waddress]

 if (!(&object))

              ^
Run Code Online (Sandbox Code Playgroud)

main.cpp:15:5:警告:nonnull参数'object'与NULL [-Wnonnull-compare]比较

 if (!(&object))

 ^~
Run Code Online (Sandbox Code Playgroud)

main.cpp:11:5:警告:nonnull参数'object'与NULL [-Wnonnull-compare]比较

 if (&object == NULL) {

 ^~
Run Code Online (Sandbox Code Playgroud)
  1. 为什么即使向其传递NULL参考值,objectin函数的地址test也不为NULL?
  2. 似乎object函数中的引用test永远不能为NULL,因此我们可以删除代码if (&object == NULL){...}if (&object == NULL) {...}避免这两个警告,对吗?

感谢您的提示。

Sto*_*ica 10

在格式正确的C ++程序中,引用绝不能为null。初始化引用的唯一有效方法是将其绑定到有效对象。可能发生“空引用”的唯一方法是,如果像您一样解引用空指针。但是,即使在您检查之前,程序的行为也是不确定的&object == NULL。该错误位于传递“空引用”的代码中,必须在此处修复。

因此,编译器警告您添加了多余的检查,该检查几乎没有保护您,因为需要修复的损坏代码不在您的函数之内。