[英]Alternative to printf with limited number of arguments?
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;
}
我已經尋找替代品,但沒有找到任何替代品。
是否所有用於記錄字符串格式消息的c命令家族(“ %d,%f
,..”)都使用變量列表?
實際上,這禁止使用printf
。 實際上,MISRA禁止整個stdio.h使用生產代碼。 原因很簡單,這些是為任何編程語言設計的一些最可怕的不安全功能。 它們具有不存在的類型安全性和多個安全性/安全性問題。
即使stdio.h函數由於其復雜性以及對調用多種形式的未定義行為的熱愛而特別糟糕,對於所有可變參數函數也是如此。 此外,可變參數函數帶有危險的“默認參數提升”規則。
因此,請忽略關鍵任務系統中的所有這些功能。
嚴格來說,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,則可以采用“偏差”作為適當的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.