[英]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.