我正在嘗試撰寫防御性代碼并static_assert<>確保結構的成員具有特定的偏移量以滿足某些硬體要求
MISRA C 規則 18-2-1 說“不應使用宏 offsetof”,所以我們已經“取消定義”了 offsetof。
我們提供了一些模板的東西,但是在使用時它們都失敗了static_assert<>
我一直無法static_assert<>在編譯器中找到適用于 C 11 的東西。
struct Commands
{
uint32_t command[4];
};
struct DMA_Bundle
{
struct header_
{
uint32_t num_of_elems;
uint8_t reserved[60];
} header;
Commands array[16];
};
我試圖確保array從一開始就是 64 個位元組。
static_assert(offsetof(DMA_Bundle,array)==64,"zoinks");
確實有效,但 MISRA 說但我不能使用它。(我無法與我們的功能安全人員爭論:/)
我嘗試了以下方法,但通常它們不起作用:
static_assert(offsetofarray()==64,"bar");
static_assert(myoffsetof(DMA_Bundle::array)==64,"double_zoinks");
顯式offsetofarray()constexpr 函式在 GCC 7.5.0 下確實可以作業,但在后來的 GCC 和 Clang(這是我們的嵌入式處理器工具使用的)下失敗。它因“static_assert 的非恒定條件”而失敗。
另一個似乎抱怨“無效使用非靜態資料成員'DMA_Bundle::array'”
而且,就其價值而言,我僅限于 C 11。
uj5u.com熱心網友回復:
一些背景:
而且,對于它的價值,我僅限于 C 11
這是你的第一個問題......
MISRA C :2008 只允許使用 C :2003 - 這之后的任何內容都超出了范圍。
MISRA C 規則 18-2-1 說“不應使用宏 offsetof”,所以我們已經“取消定義”了 offsetof。
的使用#undef違反了規定的規則 16-0-3(并且沒有必要#undef offsetof)
現在來解決主要問題:
規則 18-2-1 是一個必需的規則,它試圖在運算元的型別不兼容時防止未定義的行為。
確實有效,但 MISRA 說但我不能使用它。(我無法與我們的功能安全人員爭論:/)
許多剪貼板監視器的問題是它們可以勾選方框,但在不了解 MISRA 實際所說的情況下采取“MISRA 說不”的態度......
我的建議,特別是如果僅在與相關時使用static_assert()是提出偏差(請參閱第 4.3.2 節和 MISRA 合規性中的擴展指南)。
偏差是一種完全合法的方法,其中規則可能會造成不便,但未定義的行為不適用。
ETA(注意與 Lundin 關于 C 的討論):在 MISRA C:2004 中,有一個等效的指南(規則 20.6)同樣對offsetof- 在 MISRA C:2012 中這個全面限制被洗掉了,未定義的行為被捕獲一般規則 1.3
在許多方面,這使得 MISRA C 偏差的證明更容易——因為基本??原理與 MISRA C 決定相匹配。
查看隸屬關系的個人資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460419.html
上一篇:如何插入到std::multimap中的std::map?
下一篇:為什么`std::thread()`和`std::packaged_task()`作業方式不同,盡管它們都接受可呼叫目標?
