2016-04-09 8 views
2

規則13.6の状態に必要:決定するためにはsizeof()演算子のオペランドが電位側affects.Iは途方に暮れています持っている任意の
式を含めるべきではありませんがどのようにオペレータの副作用で
ますsizeof()演算子の結果に影響します。
誰でもこの例で説明できますか?MISRAルール13.6説明は

void f(int32_t n) 
{ 
    size_t s; 
    s = sizeof(int32_t[n]); //Compliant 
    s = sizeof(int32_t[n++]); //Non Compliant 
} 

さらに理解しやすい例を挙げて説明できますか?

答えて

0

演算子は特殊なケースです。通常、コンパイル時にのみ評価され、定数で置き換えられます。つまり、オペランド内の副作用(コード)がsizeofであるということは、実際には実行されません。そのようなバグの例:

sizeof(i++) // Bad! i will not get incremented 
sizeof(i=j) // Bad! i will not get a new value 
sizeof(func()) // Bad! The function will not get called 

sizeofが実行時に評価され、オペランドは可変長配列型である場合つまりされたときに一つの例外がある。)

MISRA文書がA提供このすべてを説明する良い根拠。小文字を読んだ場合、volatile変数の例外もあります。式にそのような変数が存在するだけで、副作用(変数の読み込み)が発生するためです。

+0

ええ、私は揮発性の例外も覚えています。しかし、この副作用の事柄の全体的なアイデアを得ることができませんでした。助けてくれてありがとう。 –

+0

@NishrinTrunkwala C標準の用語副作用の正式な定義があります。5.1.2.2.3「揮発性オブジェクトにアクセスする、オブジェクトを変更する、ファイルを変更する、またはこれらの操作のいずれかを行う関数を呼び出すことは、すべて副作用です、 " – Lundin

3

演算子sizeofに入力された式は評価されません。式のタイプのみが演繹され、sizeofオペレータへの入力として使用されます。つまり、MISRAに準拠していない場合には、n++,nは、が増分されません。これはやや直感的ですが、MISRAはエラーを避けるために副作用のある式を使用しないことをお勧めします。

+0

s /準拠していない場合/準拠の場合/ – wildplasser

+0

@wildplasser正しいことがわかりました。不適合ケースは、ポストインクリメント演算子を持つものであり、直観的には「n」がインクリメントされない。 – atturri

+0

少し曖昧なことがあります。 "[準拠していない]":**標準**に準拠しているか、** MISRA **に準拠していますか? – wildplasser