Misra 2004有以下规则:
Rule 16.1: Functions shall not be defined with variable numbers of arguments
因此,printf
等功能无法与规则16.1一起使用。
uint32_t debug_print(char *format, ...)
{
int int_ret_val=0;
uint32_t ret_val = ERR_NO_ERROR;
va_list arguments;
va_start(arguments, format);
ret_val = vprintf(format, arguments);
va_end(arguments);
return ret_val;
}
我已经搜索了替代方案,但没有找到任何替代方案。
用于记录字符串格式化消息(" %d,%f
,..")的所有c系列命令是否都使用变量列表?
答案 0 :(得分:6)
确实这禁止使用printf
。事实上,MISRA从生产代码中禁止整个stdio.h。原因很简单,这些是有史以来为任何编程语言设计的最可怕的不安全功能。它们不存在类型安全性和多种安全/安全问题。
对于所有可变参数函数也是如此,即使stdio.h特别糟糕,因为它们的复杂性和对调用多种形式的未定义行为的喜爱。此外,可变参数函数伴随着危险的"默认参数提升"规则。
所以在任务关键型系统中忘记这些功能。
答案 1 :(得分:0)
严格来说,MISRA-C:2004规则16.1(现在是MISRA C:2012规则17.1)不适用于标准库函数,只适用于使用stdarg.h的用户定义函数
然而,MISRA-C:2004规则20.9(现在是MISRA C:2012规则21.6)排除了使用标准库输入/输出功能(在生产代码中) - 明确禁止"禁止" printf()及其相关函数的使用
如果你真的需要使用stdarg.h或stdio.h,那么偏差是适当的路线。