关键字: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’可能会导致代码变得难以维护和理解。