使用assert避免外部传入异常和向外部传递异常

        以往C/C++编程的时候,并不习惯用assert,最近调试一些开源代码,发现assert使用挺多,且作用很明显,所以针对这个小知识点做了小总结。

使用assert主要好处有:

1:出现异常,能快速定位问题,assert接口函数能打印出问题的函数和行号

2:对于模块/函数化设计帮助挺大,因为很多变量、指针、对象等等,无法确定别人传递给你的是否正确,当然,也可以避免你的代码向外传播异常。

首先看看assert的实现过程

1:assert源码

    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

以上可知,expression不成立,就会调用wassert将相关信息打印出来,写了一个简单程序在VC上验证如下:

#include "stdafx.h"
#include "stdio.h"
#include "assert.h"

int main()
{
	int *p = nullptr;
	assert(p != nullptr);
	getchar();
    return 0;
}

2:执行反汇编

 如上,执行assert,判断指针是否为null(实际代码中!!(expression),两个!!没作用,只是表达式括号的要求吧),之后跳转到指定地址,保存相关寄存器及push相关调试信息到栈,最后调用__RTC_CheckESP,最终跳转到Abort执行地址

3: 最终执行结果:

 总结:

好处主要两点吧

1:对于代码模块化实现,或者调用外部API的时候,使用assert作用较大,因为你不知道外部传给的指针、地址、参数等是否合规,会不会传入数据不正确而导致你的代码异常,所以在你的函数执行其他接口时,先assert相关资源是否合规很有必要,有问题能及时定位。

2:你的函数执行完成后,会不会给系统留下异常呢,如异常、空指针、空对象等等,为了避免你写的函数给别人带来问题,在你的一个独立接口完成后,最后API返回前,检查下相关需要传递出去的对象合法性,放置异常蔓延。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术的微光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值