社区首页 >问答首页 >如何修正警告:“编译器可以假定'object‘的地址永远不会为空”

如何修正警告:“编译器可以假定'object‘的地址永远不会为空”
EN

Stack Overflow用户
提问于 2019-06-17 00:56:18
回答 2查看 5.3K关注 0票数 3

我使用gcc8编译以下代码:

代码语言:javascript
代码运行次数:0
复制
#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- main.cpp -lm -latomic -lstdc++fs & ./a.out main.cpp:函数'void (person&)‘: main.cpp:11:17:警告:编译器可以假定'object‘的地址永远不会为空-Waddress 如果(&object == NULL) {^ main.cpp:15:18:警告:编译器可以假定'object‘的地址永远不会为空-Waddress 如果(!(&object)) ^ main.cpp:15:5:警告:非空参数'object‘相比于NULL -Wnonnull-比较 如果(!(&object)) ^~ main.cpp:11:5:警告:非空参数'object‘相比于NULL -Wnonnull-比较 如果(&object == NULL) { ^~

  1. 为什么object在函数test中的地址不为空,甚至向它传递一个空引用值?
  2. 函数object中的引用test似乎永远不可能为NULL,所以我们可以删除代码if (&object == NULL){...}if (&object == NULL) {...}以避免这两个警告,对吗?

谢谢你的暗示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-17 01:00:58

在格式良好的C++程序中,引用从不为空。初始化引用的唯一有效方法是将其绑定到有效对象。“空引用”可能发生的唯一方法是取消空指针,就像您所做的那样。但是,即使在检查&object == NULL之前,程序的行为也是未定义的。错误在传递“空引用”的代码中,必须在那里修复。

所以编译器警告您,您添加了一个多余的检查,它保护您从小到空,因为需要修复的坏代码在您的函数之外。

票数 13
EN

Stack Overflow用户

发布于 2019-06-17 01:16:01

代码语言:javascript
代码运行次数:0
复制
Person* ptr_object = NULL;
Person& ref_object= *ptr_object;

通过在这里取消引用ptr_object,您将取消引用一个空指针,这是一个未定义的行为。引用不应引用为NULL。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56627939

复制
相关文章
40岁后学习编程:永远不会为时已晚
万万没想到,正是水族饲养诱惑了43岁的Ken Hart进入网页设计世界。在有了多年在自己家中照顾水生生物的经验之后,Hart开始使用诸如Wix这样的免费网站建设工具来制作一个水族饲养的博客。这个博客引
用户1667431
2018/04/18
8220
40岁后学习编程:永远不会为时已晚
40岁后学习编程:永远不会为时已晚
万万没想到,正是水族饲养诱惑了43岁的Ken Hart进入网页设计世界。在有了多年在自己家中照顾水生生物的经验之后,Hart开始使用诸如Wix这样的免费网站建设工具来制作一个水族饲养的博客。这个博客引起了其他水族爱好者的共鸣,因此很快就有了稳定的流量。新得到的人气让Hart开始认真研究他的网站,以及重新评估设计选择。
哲洛不闹
2018/09/18
1K0
40岁后学习编程:永远不会为时已晚
空对象模式(Null Object Pattern)
空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。
Tom弹架构
2021/11/25
8240
编译器警告RegisterStartupScript已经过时
protected void AlertMsg(string msg) { this.Page.RegisterStartupScript(“alert”, “<script language=\”javascript\”>alert(‘” + msg + “‘);</script>”); } 使用上面的代码建立的客户端脚本块 编译器会警告RegisterStartupScript已经过时 MSDN查到的Page.RegisterStartupScript 方法
全栈程序员站长
2022/09/09
2450
空对象模式(Null Object Pattern)
空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。
Tom弹架构
2021/12/21
1.1K0
空对象模式(Null Object Pattern)
破除匪夷所思bugs,从修正编译警告开始
交付软件给客户却是很多问题,一些问题解决就可以了。但有些问题却是一时出现,一时不出现,十分令人恼火,程序猿是超人也难以应付。本文以编译警告为引入点述说在开发过程中的匪夷所思的问题。引以为鉴,重视警告的影响。 1.未引用形参 warning: unused variable 'value'. 警告:未使用变量"value" 致命行为: 用错变量导致程序得不到正确结果。 double sum(double a, double b) { return a; } 变量未使用造成内存泄漏。 ... Car car
Qt君
2019/07/15
1.2K0
让页面不缓存,永远访问最新的数据
前言:每一次请求,我们都知道浏览器会做一定处理,其中就包括对数据的缓存处理,相同参数做查询的处理,就可以让数据保存在客户端,这样可以减少对服务器的请求,但是,有时候一些特殊情况查询,是需要时时刻刻保持最新的,就好像学过sql类似数据脏读、幻读之类的情况,我们不需要浏览器做缓存处理,这时候该怎么处理呢?
小小鱼儿小小林
2020/06/24
7950
电脑ip地址如何查看?电脑ip地址可以修改吗?
在现在社会中大家可以通过多种方式进入互联网的世界中,无论是手机还是电脑都可以访问到互联网,每个电脑的地址都是不一样的,为了区分同一个地方不同电脑的互联网地址,为每台电脑都设定了专门的IP地址,保证了用户们在计算机联网操作的时候,能够更加高效方便的区分出不同的对象。那么电脑ip地址如何查看?电脑ip地址可以修改吗?下面小编就为大家详细介绍一下关于电脑ip地址的相关知识。
用户8739990
2021/06/25
9.1K0
idea没有绑远程地址,如何提交到github的空项目
一 有同事问我怎么提交到github的空项目....这么简单.... 二 1.创建本地的git仓库 选择自己的项目 创建成功 2.添加代码,选中左边的文件,add 3.提交 5.定义远程仓库,不定义的
ydymz
2018/11/07
7760
solidity智能合约如何判断地址为0或空
原文链接:https://www.choupangxia.com/2019/07/16/solidity智能合约如何判断地址为0或空/
程序新视界
2019/08/01
2.8K0
为啥买东西,新疆永远不包邮?
不去新疆,不知中国之大。166万平方公里,大漠、湖泊、冰川、河流、草原、森林、溶洞……以及生活其中的47个民族,几乎囊括了关于一处旅行地所有的想象。
IT阅读排行榜
2018/12/14
5280
最上乘的管理艺术:永远不告诉你Deadline
我以前工作的老板,有一套很特殊的“闹钟”管理哲学,可以将荣耀归属给员工,并给我们很大很大的“成就感”。怎么说呢.比方说,有一次,老板交待我们部门做一件事,他说,等到他处理完这个月报税的事,就会和我们开会。 “老板到底什么时候要看.”我们私下问部门主管。“就是处理完报税之后就会看。”部门主管只是重复老板的话,因为他也不知道到底老板什么时候要找他开会。于是,我们一整个部门,神经紧绷,今天一整天努力做、努力做,因为不知道老板何时会与我们开会。 结果,今天没有开会。 隔天,老板经过我们部门座位,抓我们其中一位同事,
SAP最佳业务实践
2018/03/27
7780
2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?
reflect.ValueOf(接口变量).IsNil(),用这个即可判断。对于值类型,会panic。两种方法如下:
福大大架构师每日一题
2020/11/10
4.9K0
2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?
Java使用@SuppressWarnings注解控制编译器产生的警告信息
在 Java 中,@SuppressWarnings 这个注解用于控制编译器产生的警告信息,其中的 unchecked 是它的一个参数,代表着我们想要抑制所有涉及到未经检查或不安全操作的警告。
高久峰
2023/10/27
4710
如何修正Netty编解码的缺陷
即从io.netty.buffer. ByteBuf ( 原始数据流) =》 io.netty.buffer .ByteBuf ( 用户数据)
JavaEdge
2021/02/22
6740
二十六、空对象模式 ( Null Object Pattern )
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查
botkenni
2022/09/23
3530
二十六、空对象模式 ( Null Object Pattern )
学会这个小技巧,SSH 会话连接永远不超时!
通过指定时间间隔在客户端和服务器之间发送空数据包,可以避免 SSH 超时。 防止 SSH 客户端超时
iMike
2019/10/10
5.2K0
惊!空 struct 地址竟然不相等
Go 语言里的空 struct{} 是一个特殊的结构,因为编译器优化的关系,会导致我们拿空 struct 指针做比较的时候出现一些意外的结果。之前有人提过相关的 issue,不过还是值得我们简单研究一番。
梦醒人间
2020/05/15
6040
本周阅读:深度探索C++对象模型
深度探索C++对象模型 1.3 章节 https://github.com/wangcy6/weekly/blob/master/reading-notes/object-model/1.object-lessons.md
程序员小王
2019/05/05
7940
本周阅读:深度探索C++对象模型
对不起,您的业务永远不会安全。但是你可以这样做。
数字时代赋予我们获取大量信息以及连通彼此的能力,但这也使我们变得更加脆弱。通常,在线购物时使用的个人信息数据极有可能成为潜在的被盗窃目标。若将公司的敏感信息存储在云端,则可以让商业间谍更容易找到。
xun珣
2018/08/14
5940

相似问题

警告:编译器可以假定‘x’的地址永远不会为空。

10

mongodb字段永远不会为空?

13

Bool永远不会为空[-Waddress]

11

POSTed值永远不会为空吗?

32

如何绕开GCC的警告,“XXX的地址永远不会是空的”?

413
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文