【问题标题】:Alternative to printf with limited number of arguments?参数数量有限的 printf 的替代方案?
【发布时间】:2018-07-19 19:45:48
【问题描述】:

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

【问题讨论】:

    标签: c printf variadic-functions misra


    【解决方案1】:

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

    对于所有可变参数函数也是如此,尽管 stdio.h 函数特别糟糕,因为它们的复杂性以及它们喜欢调用多种形式的未定义行为。此外,可变参数函数带有危险的“默认参数提升”规则。

    因此,请忘记任务关键型系统中的所有这些功能。

    • 在托管系统 (OS) 上,请改用系统特定的 API:s。
    • 在独立系统(无操作系统)上,stdio 一开始就没有多大意义,您应该使用对应用程序有意义的任何自定义接口。

    【讨论】:

    • Lundin,你有什么具体的 API 例子可以开始吗?我现在仍然不知道。我正在使用 uOS,这是一个非常轻量级的操作系统,支持 C 库,我需要找到 stdio 的具体替代方案
    【解决方案2】:

    严格来说 MISRA-C:2004 Rule 16.1(现在 MISRA C:2012 Rule 17.1)不适用于标准库函数,而仅适用于使用 stdarg.h 的用户定义函数

    但是 MISRA-C:2004 规则 20.9(现为 MISRA C:2012 规则 21.6)禁止使用标准库输入/输出函数(在生产代码中)——它明确“禁止”使用 printf() 及其相关功能

    如果您确实需要使用 stdarg.h 或 stdio.h,那么 Deviation 是合适的选择。

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2017-07-15
      • 2012-11-24
      • 1970-01-01
      • 2021-08-30
      • 2019-04-22
      • 2020-06-05
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多