有限参数的printf替代方案?

3

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个回答

7
实际上,MISRA禁止在生产代码中使用stdio.h库,包括printf函数。原因是这些函数是编程语言中最不安全的函数之一,存在类型安全问题和多个安全问题。同样适用于所有变参函数,尽管stdio.h中的变参函数特别糟糕,因为它们复杂且容易引起未定义行为。此外,变参函数带有危险的“默认参数提升”规则。在关键任务系统中,请忘记这些函数。
对于托管系统(操作系统),请使用特定于系统的API。对于无操作系统的自由系统,stdio.h没有太多意义,并且应该使用适合应用程序的自定义接口。

1
Lundin,你有任何可以开始使用的API的具体示例吗?我现在还没有头绪。我正在使用uOS,这是一个非常轻量级的操作系统,支持C库,我需要找到具体的替代stdio的方法。 - ransh

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,则异常处理是应该遵循的适当路线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接