2009-12-05 8 views
14

Bir müşteri Geçenlerde işveren C kod temeli statik analizini gerçekleştirdik ve bize sonuçları vermiştir. kullanışlı yamalar arasında do { ... } while(0,0) ünlü do { ... } while(0) makro değiştirme isteği oldu. Onların yama ne yaptığını ben ( dönüş için sekans operatörünü kullanarak ikinci "0" değerine değerlendirmek, böylece etki aynıdır) anlıyorum ama onlar ilk form üzerinde ikinci bir form tercih ediyorum neden açık değil . C makrolarında, biri {...} tercihini yaparken (0,0), {...} iken (0)?

bir makro ikinci formu tercih etmeliyiz neden meşru bir neden var mı, yoksa bizim müşterinin statik analiz aşırı bilgiçlik ediliyor?

+5

Müşterinizin statik analiz aracı aşırı bir şey olmaktan çıktı, bu kesin. –

+7

"Fazla aşırı gereksiz" için giderdim. –

+3

Bunu yapmak için herhangi bir sebep düşünemiyorum. Belki de bir takım "bu asla olmayacak" satırları boyunca bir süre (0) durumuyla şikâyet eder fakat böyle bir araç 1) bunun, makrolarda C ile çok yaygın bir deyim olduğunu ve 2) do ... (0) ve iken (0) {}. Onlara mantık istedin mi? –

cevap

11

Eh, cevabını alacağız:

bir makro ikinci formu tercih etmeliyiz neden meşru bir sebep var mı ...?

sayılı meşru hiçbir sebep yoktur. Her ikisi de her zaman yanlış olarak değerlendirir ve herhangi bir iyi derleyici muhtemelen mecliste ikincisini birinciye çevirir. Bazı durumlarda geçersiz olması için herhangi bir sebep olsaydı, C bu sebepten ötürü yeterince uzun bir süre önce bu kadar büyük bir guru tarafından keşfedildi.

Kodunuzu baykuş-gözünüze yaklaştırmak isterseniz while(0,0). Aksi takdirde, C programlama dünyasının geri kalanının ne kullandığını kullanın ve müşterinizin statik analiz aracını kullanmasını söyleyin. onlar orada hiçbir davranış farkı olduğunu ve bu ikisi arasında hiçbir çalışma zamanı maliyet farkı olmalıdır olsa

do { ... } while(0,0) 

do { ... } while(0) 

üzerinde kullanarak önerebiliriz neden olarak

+0

Hiçbir şey değerlendirmez; ve do-loop bir ifade değildir ve hiçbir değeri yoktur. Int x = macro(); 'yi atamayı deneyin ve derleme başarısız olur. – Clifford

+1

Genel olarak "0" ve "0" değerlerini değerlendirmekteyim. –

+0

Tamam; Hâlâ bir bütün olarak fayda sağlamaya çalışıyordum. – Clifford

11

Sadece bir tahmin.

Tahminimce, statik analiz aracı while döngüsünün basit durumda bir sabit tarafından kontrol edilmesinden şikayetçisidir ve 0,0 kullanıldığında bu yoktur. Müşterinin önerisi muhtemelen sadece aletten bir takım yanlış pozitifler almıyor.

Mesela ben bazen ben sürekli tarafından kontrol edilen bir koşullu deyimi olmasını istediğiniz durumlarda rastlamak, ancak derleyici bir sabite değerlendiren bir koşullu ifadede ilgili bir uyarı ile şikayet edecektir. Öyleyse derleyiciyi şikayet etmemek için bir çemberden atlamak zorundayım (çünkü sahte uyarılara sahip olmak istemiyorum).

Müşterinin önerisi, bu uyarıyı susturmak için kullandığım çemberlerden biridir, ancak benim durumumda bir while döngüsünü kontrol etmiyordu, bir "her zaman başarısız" iddiasıyla uğraşmaktı. Bazen, asla yürütmemesi gereken bir kod alanına sahip olacağım (belki de bir anahtarın varsayılan durumu). En az bir derleyici ben ifade etmekle ilgili bir uyarı her zaman false olarak değerlendiren sorunları kullanın

assert(!"We should have never gotten here, dammit..."); 

Ama: Bu durumda ben her zaman bazı iletisiyle başarısız olur bir onaylama olabilir. Ancak, ben bunu değiştirin:

assert(("We should have never gotten here, dammit...", 0)); 

uyarı uzağa gider ve herkes mutlu. Müşterinizin statik analiz aracının da olabileceğini tahmin ediyorum.Sorunu çözmek için bir araç satıcısına söylemek mümkün olması güzel olabilir, ama aslında istiyorsun meşru durumlar da olabilir

#define ASSERT_FAIL(x) assert(((x), 0)) 

: Genellikle gibi bir makro arkasında çember atlama 'bu biraz gizlemek unutmayın Sabit bir boole ifadesi tarafından kontrol edilen bir döngüyü teşhis etmek. Böyle bir değişiklik yapmak için bir araç satıcısını ikna etseniz bile, gelecek yıl için size yardımcı olmamanın ya da bir düzeltmenin gerçekleşmesi için bu durumun söz konusu olabileceğinden bahsetmemek gerekir. süre (0,0) kullanarak,

+2

+1 Bu olabilir, ancak bu durumda, bu uyarılar yalnızca komut satırı seçenekleriyle devre dışı bırakılmalıdır. Gerekli olmayan çemberleri kapatabildiğinizde neden çemberin içinden geçersiniz? –

+1

Eh, bir, derleyici veya araç seçenekleri ile etrafta dolaşmak bir çember atlama şekli olarak düşünülebilir. Makefillerle ya da yaptıklarınızı kontrol eden her şey, C preprocessor korsanlığından çok daha fazla kara büyüdür (ve bu çok şey ifade ediyor). Bir başkası için, uyarının her şey için devre dışı bırakılmasını istemeyebilirsiniz - belki de bu aptal hilelere ihtiyaç duyan hata ayıklama makroları için. –

+0

+1 Bu kabul edilen cevap olmalı. – Calmarius

8

(C4127 uyarı) sabit bir durum hakkında bir uyarı oluşturmak Microsoft derleyici engeller.

Bu uyarı etkinleştirildiğinde (ör./W4 veya/Wall ile), bu küçük küçük hile ile (see this other thread) duruma göre kapatılabilir.