替代printf参数有限吗?

时间:2018-02-09 05:05:44

标签: c printf variadic-functions misra

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系列命令是否都使用变量列表?

2 个答案:

答案 0 :(得分:6)

确实这禁止使用printf。事实上,MISRA从生产代码中禁止整个stdio.h。原因很简单,这些是有史以来为任何编程语言设计的最可怕的不安全功能。它们不存在类型安全性和多种安全/安全问题。

对于所有可变参数函数也是如此,即使stdio.h特别糟糕,因为它们的复杂性和对调用多种形式的未定义行为的喜爱。此外,可变参数函数伴随着危险的"默认参数提升"规则。

所以在任务关键型系统中忘记这些功能。

  • 在托管系统(OS)上,使用系统特定的API:而不是。
  • 在一个独立系统(没有操作系统)上,stdio从一开始就没有多大意义,你应该使用对应用程序有意义的任何自定义界面。

答案 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,那么偏差是适当的路线。