如何修复警告 "the compiler can assume that the address of 'object' will never be NULL"
How to fix warning "the compiler can assume that the address of 'object' will never be NULL"
我使用 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);
}
然后,编译后出现两个警告运行:
$g++ -std=c++14 -pthread -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread
-pedantic-errors main.cpp -lm -latomic -lstdc++fs && ./a.out
main.cpp: In function 'void test(person&)':
main.cpp:11:17: warning: the compiler can assume that the address of
'object' will never be NULL [-Waddress]
if (&object == NULL) {
^
main.cpp:15:18: warning: the compiler can assume that the address of
'object' will never be NULL [-Waddress]
if (!(&object))
^
main.cpp:15:5: warning: nonnull argument 'object' compared to NULL
[-Wnonnull-compare]
if (!(&object))
^~
main.cpp:11:5: warning: nonnull argument 'object' compared to NULL
[-Wnonnull-compare]
if (&object == NULL) {
^~
- 为什么
object
在函数test
中的地址不是NULL,甚至向它传递一个NULL引用值?
- 似乎函数
test
中的引用object
永远不能为NULL,所以我们可以删除代码if (&object == NULL){...}
和if (&object == NULL) {...}
来避免这两个警告,对吧?
感谢提示。
在 well-formed C++ 程序中引用永远不会为空。初始化引用的唯一有效方法是将其绑定到有效对象。 "null reference" 可能发生的唯一方法是像您一样取消引用空指针。但是即使在检查 &object == NULL
之前,程序的行为也是未定义的。该错误存在于通过 "null reference" 的代码中,必须 在那里修复。
因此编译器警告您添加了一个多余的检查,这几乎没有保护您,因为需要修复的损坏代码在您的函数之外。
Person* ptr_object = NULL;
Person& ref_object= *ptr_object;
通过在此处取消引用 ptr_object,您将取消引用 NULL 指针,这是未定义的行为。引用不应引用 NULL。
我使用 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);
}
然后,编译后出现两个警告运行:
$g++ -std=c++14 -pthread -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc++fs && ./a.out
main.cpp: In function 'void test(person&)':
main.cpp:11:17: warning: the compiler can assume that the address of 'object' will never be NULL [-Waddress]
if (&object == NULL) { ^
main.cpp:15:18: warning: the compiler can assume that the address of 'object' will never be NULL [-Waddress]
if (!(&object)) ^
main.cpp:15:5: warning: nonnull argument 'object' compared to NULL [-Wnonnull-compare]
if (!(&object)) ^~
main.cpp:11:5: warning: nonnull argument 'object' compared to NULL [-Wnonnull-compare]
if (&object == NULL) { ^~
- 为什么
object
在函数test
中的地址不是NULL,甚至向它传递一个NULL引用值? - 似乎函数
test
中的引用object
永远不能为NULL,所以我们可以删除代码if (&object == NULL){...}
和if (&object == NULL) {...}
来避免这两个警告,对吧?
感谢提示。
在 well-formed C++ 程序中引用永远不会为空。初始化引用的唯一有效方法是将其绑定到有效对象。 "null reference" 可能发生的唯一方法是像您一样取消引用空指针。但是即使在检查 &object == NULL
之前,程序的行为也是未定义的。该错误存在于通过 "null reference" 的代码中,必须 在那里修复。
因此编译器警告您添加了一个多余的检查,这几乎没有保护您,因为需要修复的损坏代码在您的函数之外。
Person* ptr_object = NULL;
Person& ref_object= *ptr_object;
通过在此处取消引用 ptr_object,您将取消引用 NULL 指针,这是未定义的行为。引用不应引用 NULL。