簡體   English   中英

解決MISRA 2012規則17.3違反問題的替代方法是什么?

[英]What can be the alternate way to solve MISRA 2012 Rule 17.3 violation?

MISRA 2012規則17.3規定,絕對不應隱式聲明函數。 但是,在這種情況下,第6行的pf_func違反了MISRA 2012 17.3規則。

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
void main(FOREACH_FUNC pf_func)
{
    uint64 var;
    pf_func(var);   /*Violation reported on this line*/
}

此處,pf_func導致違反MISRA 17.3規則。 此違規有效還是我正在使用的靜態分析工具中的錯誤? 此外,是否有其他解決方案可以避免這種沖突,而無需更改代碼的工作流程?

但是,當我將代碼修改為此時,

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
FOREACH_FUNC pf_func(uint64 ull_key);
void main()
{
    uint64 var;
    pf_func(var);
}

沒有報告違反規則17.3。 我在這里無法理解函數指針的工作。 這是解決此問題的正確或道德方法嗎? 還是靜態分析工具本身存在故障?

規則17.3是“不得隱式聲明函數”,它指的是即使沒有原型格式聲明也允許函數調用的舊C90方法。

您的代碼不執行此操作。 它所做的只是通過函數指針來調用函數。 因此,沒有違反MISRA的情況,這是一個誤報,而且是靜態分析器中的一個工具錯誤。

但是,假設您使用的是C99或更高版本,則首選使用stdint.h而非自制的整數類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM