2013-08-07 12 views
7

'un crossed initialization hakkında çok fazla şikayette olduğunu fark ettim ve bu yanlış pozitif hataların derleme sırasında SSA formuna bakarak neden silinemediğini merak ediyorum. g++ -Wall -Wextra -o example1 example1.cc (g++ 4.8.1) ile derlenen, derleyici aşağıdaki hata iletisini verirOverkilling C++ 'da "değişkenin başlatılmasını başlatır" hatası?

#include <cstdlib> 

int main() 
{ 
    goto end; 

    int i = 0; // unused variable declaration 

end: 
    return EXIT_SUCCESS; 
} 

:

bana çok basit bir örnek vereyim Yani

example1.cc: In function ‘int main()’: 
example1.cc:10:2: error: jump to label ‘end’ [-fpermissive] 
    end: 
^
example1.cc:6:8: error: from here [-fpermissive] 
    goto end; 
     ^
example1.cc:8:7: error: crosses initialization of ‘int i’ 
    int i = 0; 
    ^
example1.cc:8:7: warning: unused variable ‘i’ [-Wunused-variable] 

, bu yükseltecek değişken kullanılmadığı için aslında bir risk olmadığı bir hata (derleyici açık bir şekilde her iki bilgiye de sahiptir ve hatayı yanlış pozitif olduğu sonucuna varmak için birleştiremez).

Daha garip, LLVM'nin bir programı analiz etmede daha verimli olduğunu umuyorum. Bu nedenle, clang++ -Wall -Wextra -o example1 example1.cc (clang++ 3.4) ile bu basit örnekte clang++ (LLVM) denedim. Ve ben aynı hata iletisi hakkında var:

example1.cc:8:7: warning: unused variable 'i' [-Wunused-variable] 
    int i = 0; 
    ^
example1.cc:6:3: error: goto into protected scope 
    goto end; 
^
example1.cc:8:7: note: jump bypasses variable initialization 
    int i = 0; 
    ^
1 warning and 1 error generated. 

Yani, burada önemli bir şey olsa ben daha bu yanlış pozitif sert algılanmasını sağlamak bir sorun eksik olduğumu eminim. Ama ne olduğunu bilmiyorum. Ya da belki C++ belirtimi, bunun böyle olması gerektiğini söylüyor.

Birinin bir fikri varsa, paylaşmaktan çekinmeyin!

Düzenleme: Ben de C (gcc veya clang) tam olarak aynı kodu derlenmiş ve sadece kullanılmayan bir değişken olma Uyarı hakkında i ile iyi gitti. Dolayısıyla, bu durumun C++ şartnamesiyle bağlantılı olması ve derleme zamanında bu sorunu tespit etmenin bir problem olmadığı gerçeğini pekiştirir.

+0

bakılmaksızın değişken 'I' kullanılır int olup olmamasından kötü şekillendirilmiş kod değil midir? Derleyiciler, uyumlu olmayan kod hakkında değil, uyumlu olmayan kod hakkında şikayet ediyorlar. – Walter

+1

Her iki derleyici de standartların tam olarak ne yaptığını yaparlar. Bir başlatmadan geçişe izin verilmez, tam durma, öykünün sonu. Analiz edilecek hiçbir şey yok. –

+0

Tamam, bunu özledim. Bu esas olarak C++ 'nin spesifikasyonundan gelmektedir ve temel bir teknik sorun olduğundan değildir. – perror

cevap

10

Derleyicilerde bir sorun yok. Kodunuz standartlara göre kötü biçimlendirilmiştir. Özel durumda, standardın gerekliliği gerekmeyebilir ve atlamaya izin verilebilir ve derleyici geçerli bir kod oluşturabilir. Bununla birlikte, bu sadece int i değişkeninin başlatılmasının hiçbir yan etkisi olmadığı içindir.

Sadece kendi kapsamında atladı bölümünü içine alarak sizin kod geçerli yapabilirsiniz

:

#include <cstdlib> 

int main() 
{ 
    goto end; 
    { 
    int i = 0; // unused variable declaration 
    } 
end: 
    // cannot use i here, as it's not defined. 
    return EXIT_SUCCESS; 
} 
+0

Belirtimde belirtildiği yerde? Onu bulamadım... – perror

8

Bu, izin verilmeyen nesneler için potansiyel olarak yıkıcılar dediğiniz için izin verilmez. Kuşkusuz, int'un kurucusu ya da yıkıcısı yok, ancak her türlü nesne için "adil" hale getiriyor. Ve teknik olarak, end: etiketinde bir şey i kullanıyor olabilir ve kuralı sıkılaştırarak, makinenin her bir kod yolunu ("durma problemi" haline gelen) kontrol etmesi gerekir.

İlgili konular