2016-04-11 25 views
0

MISRA:揮発性オブジェクトへのポインタと整数型の間をキャストしますか?私は、コードセクションを以下している

----------header--------------------- 
typedef volatile struct REG_Base{ 
    a; 
    b; 
}REG_t 

#define address (0xFFF45556) 
------------------------------------ 

--------Source----------------------- 

LOCAL REG_t *pToREG; 
pToREG= (REG_t *) address; 

------------------------------------- 

私は最後の行に「揮発性オブジェクトへのポインタと整数型間キャスト」MISRAメッセージが表示されました。

このメッセージを避けるにはどうすればよいですか?

Thx!

+0

volateオブジェクトへのポインタと整数型の間にキャストしないでください。私はMISRAにあまり慣れていませんが、おそらくあなたはそれが許さないものをやっています。 –

+2

注:1) 'LOCAL'の定義を後にします。2)' typedef'の 'volatile'、IMOを削除します。そして、必要に応じて明示的に 'volatile'を使います。おそらく 'pToREG =(揮発性のREG_t *)アドレス;'が動作します。 – chux

+0

この構造体は、有効なCのようには見えません。 'a;'と 'b;'、醜いマクロとは何ですか? – Lundin

答えて

3

MISRAには、整数からポインタへのキャストを禁止するアドバイザリルールがあります。その理由は、整数がポインタを表現することができない場合、またはミスアライメントの場合に、不十分に定義された動作に関係しているということです。

これは過度に賢明なルールの1つであり、ちょうど助言です。ほとんどの組込みシステムはルールから逸脱します。言われて、あなたのコードは、いくつかの疑問のものが含まれていることを


  • volatile修飾子は、typedefでの一部であってはなりません。
  • ab宣言は意味をなさない。彼らはある種の醜いマクロですか?
  • 物理アドレスへの構造体のマッピングは、移植性がなく、安全ではありません。構造体にパディングが含まれている可能性があります。指定された型のアドレスが正しく整列されていない可能性があります。最低でも、構造体の埋め込みがないことを保証する手段が必要です。静的なアサートが望ましい場合があります。

また、MISRAでは整数定数が0xFFF45556uと書かれている必要があります。 0xFFF45556unsigned intであり、例えば0x7FFFFFFFはsigned int型です。これは悪い考えではありません。これらのことは、慎重でない限り、暗黙的なタイプのプロモーションに関連する微妙なバグにつながる可能性があります。

+0

私はMISRAの記述を見ましたが、「メモリマップされたI/Oポートに対処しなければならない組み込みソフトウェアアプリケーションでは、このタイプの操作は珍しいことではありません。これは私の場合を表しています。 aとbの宣言は実際には生産的なコードではないダミーの宣言だけでした。ありがとうございました! – JohnDoe

関連する問題