你真的会使用assert吗?

简介:

写这篇博客源于在阅读lighttpd源代码是遇到的一个关于assert应用的疑问。

在阅读lighttpd源代码时,发现比比皆是的对malloc的调用结果进行assert检查,比如:Buffer.c:

复制代码
复制代码
buffer* buffer_init(void) {

buffer *b;

b = malloc(sizeof(*b));
assert(b);

b->ptr = NULL;
b->size = 0;
b->used = 0;

return b;

}
复制代码
复制代码
这里的assert(b)似乎有问题,实际release版本在运行中难道不会发生malloc返回NULL的情况吗?之后在阅读《Writing Solid Code 》一书时找到了答案。

对assert的基本用法就不再累述了,下面总结一下assert的实际应用的Recommended practice吧:

1、要使用断言对函数参数进行确认

主要有以下情况:

指针不是NULL的断言;
index值或size值不是负值或小于已知限值的断言;这一条也可以这么描述:要从程序中删去无定义的特性或者在程序中使用断言来检查出无定义特性的非法使用

2、每个断言必须在头文件中的函数功能描述的断言部分进行说明(不要浪费别人的时间 ─── 详细说明不清楚的断言 ),例如:

  • Asserts:

    • 'size' is no greater then LIMIT.
    • 'format' is not NULL.
    • The function result is no greater than LIMIT.
      */

如果没有断言, 写 “Nothing”:

  • Asserts:
  • Nothing
    */

(以上的格式也许严格了一些,不过如果真的这么做,对代码的可阅读性会很有帮助)
3、断言和错误校验的区别

正确使用断言,必须要清楚程序错误(program errors)和运行时错误(run- time errors)之间的区别;

一个程序错误是一个bug,永远不应该发生。
一个运行时错误是在程序运行的任何时候都可能会发生.
断言并不是一种处理运行时错误的机制。例如在需要输入正数的时候,用户输入了一个负数,如果用断言来检测这种情况就不是好的设计。对于这种情况需要用合适的错误检查和恢复处理的代码来进行处理。

再回到lighttpd中对malloc函数的返回值进行assert断言,我觉得也属于这个问题,这应该是一个运行时错误,而不是程序错误;所以,我觉得《C和指针》一书中对malloc返回NULL处理是通过一个错误检查分配器来处理的。

4、断言和bug

断言大致分为前置条件(Preconditions)、后置条件(Postconditions)、不变性条件(Invariants)

如果前置条件不成立,发生Assertion violations,则调用该函数的代码存在bug,需要尽快找到并解决;

如果后置条件不成立,发生Assertion violations,则(函数的)实现代码存在bug,需要尽快找到并解决;

例如:

复制代码
复制代码
void doBlah(int x)

{

assert(x!=0);

....

}
复制代码
复制代码
这段代码说明这个函数的调用不可能传入参数0,如果发生这种情况,说明调用这个函数的代码存在bug;

以上是自己的一点理解,欢迎高手指正!!!
参考:How to use assertions in C

    《Writing Solid Code 》
目录
相关文章
|
安全 数据安全/隐私保护 Windows
解锁安全之门,Windows Server 2019密码修改攻略大揭秘
解锁安全之门,Windows Server 2019密码修改攻略大揭秘
1072 0
|
机器学习/深度学习 存储 数据采集
阿里云 ACP是什么?阿里云 ACP有什么用?
ACP是什么,它是阿里云企业推出的针对于数据分析工程师的资格认证,有极高的含金量。因为阿里云在国内市场处于领先地位,他们推出的资格认证自然而然受到很多人的欢迎,很多互联网行业从业人员都以获得阿里ACP认证为荣。那么,阿里云 ACP是什么?阿里云 ACP有什么用?在认证大使官网上查阅了相关资料,我得到了答案
2933 0
阿里云 ACP是什么?阿里云 ACP有什么用?
|
3月前
|
机器学习/深度学习 数据采集 缓存
《深度剖析:Java中用Stanford NLP工具包优化命名实体识别》
命名实体识别(NER)是自然语言处理中的关键任务,而Stanford NLP工具包作为Java环境下的强大工具,为开发者提供了词性标注、句法分析和NER等功能。针对特定领域(如金融、医疗),默认模型可能无法满足需求,因此优化至关重要。优化方法包括数据预处理(文本清洗、分词、词性标注)、模型定制(微调CRF模型或融合多模型)、特征工程(上下文特征、领域词典)及性能提升(模型压缩、并行计算)。以金融科技公司为例,通过优化,NER准确率从70%提升至90%以上,处理速度显著提高,助力业务决策。
172 1
|
11月前
|
机器学习/深度学习 编解码 自然语言处理
ResNet(残差网络)
【10月更文挑战第1天】
|
11月前
|
druid Java Maven
|
Cloud Native 安全 Serverless
【阿里云云原生专栏】低代码开发在云原生平台的应用:阿里云低代码服务探索
【5月更文挑战第27天】在云原生时代,低代码开发凭借其图形化界面和预构建模块,简化了应用开发,提升了效率。阿里云积极探索低代码领域,推出函数计算FC和应用配置中心ACM等服务。FC让开发者无需关注基础设施,仅需少量代码即可实现应用部署,而ACM则提供动态配置管理,增强应用灵活性。阿里云的这些服务为企业数字化转型提供了高效、安全的解决方案,预示着低代码开发在云原生平台上的重要地位。
364 1
|
存储 大数据 云计算
云计算:技术与应用的融合之美
云计算:技术与应用的融合之美
535 0
|
机器学习/深度学习 算法 物联网
LISA微调技术解析:比LoRA更低的显存更快的速度
LISA是Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning的简写,由UIUC联合LMFlow团队于近期提出的一项LLM微调技术,可实现把全参训练的显存使用降低到之前的三分之一左右,而使用的技术方法却是非常简单。