人大金仓数据库KingbaseES KES_SysRman中的noreturn函数属性

关键字:KES_SysRman、noreturn、人大金仓、KingbaseES

概述

‘noreturn’是一个函数属性,用于告诉编译器某个函数不会正常返回到调用点,意味着函数被调用后,不会返回到调用它的地方,而是执行一些特定的操作,比如终止程序、抛出异常等。

noreturn与void的区别

在C语言中,‘noreturn’和‘void’具有不同的含义和作用,它们分别用于函数声明和函数定义中。

  • ‘void’:
    • ‘void’是用于函数的返回类型,当一个函数的返回类型是‘void’时,表示这个函数不返回任何值。
    • 例如:‘void function();’声明了一个没有返回值的函数。
    • 如果一个函数确实需要执行一些操作并返回,但不需要返回特定的值,例如使用一个函数在屏幕上打印一些信息,但不需要返回任何结果,此时使用void类型更合适;
  • ‘noreturn’:
    • ‘noreturn’是用于函数声明的一个特殊属性,用来告诉编译器这个函数不会返回到调用点。
    • 例如:‘_Noreturn void exit(int status);’是标准库函数‘exit’的声明,表示‘exit’函数不会返回。
    • 如果函数执行后不应该返回,例如用于终止程序或处理不可恢复的错误的函数,那么使用noreturn属性是更好的选择。

noreturn优点

  • 编译器优化:当使用‘noreturn’属性声明函数时,编译器知道这个函数不会正常返回,从而可以进行一些优化。例如,它可能会省略生成返回代码、保存寄存器状态等操作,从而提高代码的执行效率;
  • 代码清晰性:某些情况下函数的主要目的是执行一些特定操作,然后终止程序,而不是返回到调用点。通过使用‘noreturn’可以清楚表达函数的意图,避免误解或混淆。
  • 编译器警告:某些情况下如果声明了一个不应该返回的函数,但它实际上却返回了,编译器可能会发出警告。使用‘noreturn’可以帮助编译器更准确的检测这种情况,并提供更好的警告信息。
  • 防止不正确的代码路径:使用‘noreturn’可以强制确保函数不会返回,防止程序进入不正确的代码路径,减少潜在的错误。
  • 文档和接口说明:在函数声明中使用‘noreturn’可以提供更明确的文档,告诉其他开发人员这个函数的预期行为,从而更好地理解和使用代码。

实例

以下是一些适合将函数定义为noreturn的情况:终止程序(调用标准库函数exit())、抛出异常、死循环、崩溃处理、硬件访问(重启等)。

例如在KES_SysRman的src/cbb/crypto_common.c文件中:

crypto_error_code()被用来抛出异常,因此将其定义为noreturn,而crypto_error()(没有被定义为noreturn)用来处理错误信息,在这个函数中调用crypto_error_code()。

函数声明如下:

在src/cbb/error_handler.c文件中:

error_internal_propagate():重新抛出错误,函数体中最后使用exit()退出

error_internal_throw():抛出错误

error_internal_throw_fmt():抛出错误

error_internal_throw_sys():抛出系统错误

error_internal_throw_on_sys():抛出格式化系统错误

以上函数都被声明为noreturn类型:

注意事项

使用‘noreturn’应慎重,只在确实需要函数不会返回时使用,过度使用‘noreturn’可能会导致代码变得难以维护和理解。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值