2016-04-09 5 views
2

Kural 13.6 devletleri gerekli: belirlemek için sizeof() operatörünün işlenen potansiyel yan affects.I bir kayıp am sahip herhangi
ifadesini içermemelidir nasıl bir operatör yan etkileri olan
olacak sizeof() operatörünün sonucunu etkiler.
Bu örnekle herhangi biri açıklanabilir mi?MISRA kural 13.6 açıklama

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

Veya herhangi biri daha anlaşılabilir bir örnek verebilir ve bununla ilgili bir açıklama yapabilir mi?

cevap

0

sizeof operatörü özel bir durumdur, genellikle yalnızca derleme zamanında değerlendirilir ve bir sabit ile değiştirilir. sizeof işleneni içindeki herhangi bir yan etkinin ("kod") gerçekte gerçekleştirilmeyeceği anlamına gelir.

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 

(. Orada sizeof çalıştırma süresi içinde değerlendirilir tek istisna ve işlenen değişken uzunluklu dizi türü olduğu durumda)

MISRA belge temin eder: böcek örnekleri Tüm bunları açıklayan iyi mantık. İyi bir baskıyı okursanız, volatile değişkenleri için bir istisna vardır, çünkü bir ifadede böyle bir değişkenin varlığı, bir yan etki ortaya çıkarır (değişkeni okuma).

+0

Evet, aynı zamanda, uçucu olan istisnayı da hatırlıyorum. Ama bu yan etki olayı fikrini alamadım. Yardım için teşekkürler. –

+0

@NishrinTrunkwala C standardı 5.1.2.2.3'de yan etkinin ifadesinin resmi bir tanımı vardır. "Uçucu bir nesneye erişim, bir nesneyi değiştirme, bir dosyayı değiştirme veya bu işlemlerin herhangi birini yapan bir işlevi çağırmanın tüm yan etkileridir. " – Lundin

3

sizeof operatörüne girilen ifade değerlendirilmez. sizeof operatörüne yalnızca ifadenin türü çıkar ve girdi olarak kullanılır. Bunun anlamı, MISRA'ya uymayan durumlarda, n++, n,'un artırılmayacağı anlamına gelir. Bu biraz sezgisel olduğundan, MISRA hatalardan kaçınmak için yan etkileri olan ifadeleri kullanmamanızı önerir.

+0

s/uyumlu olmayan büyük/küçük harf/ – wildplasser

+0

@wildplasser Doğru olduğunu buluyorum. Uyumlu olmayan durum, karşı-sezgisel olarak n '' artış göstermeyen art-increment operatörü olan bir durumdur. – atturri

+0

Bu biraz sıradan olabilirdi. "[non] uyumlu": = ** standardı ** ile uyumlu veya ** MISRA ** ile uyumlu mu? – wildplasser