Derleyici algılama açıkçası başlatılmamış değişken
Ben denedim tüm C derleyicileri kod parçasında başlatılmamış değişkenler aşağıda tespit olmaz. Henüz durum belli işte.
Bu parçacığın işlevi ile ilgili hiç zahmet etme. Gerçek şifre değil, ve bu konuda soruşturma için soyundum.
BOOL NearEqual (int tauxprecis, int max, int value)
{
int tauxtrouve; // Not initialized at this point
int totaldiff; // Not initialized at this point
for (int i = 0; i < max; i )
{
if (2 < totaldiff) // At this point totaldiff is not initialized
{
totaldiff = 2;
tauxtrouve = value; // Commenting this line out will produce warning
}
}
return tauxtrouve == tauxprecis ; // At this point tauxtrouve is potentially
// not initialized.
}
Ben tauxtrouve = value ;
, açıklama öte yandan, "local variable 'tauxtrouve' used without having been initialized"
uyarı alıyorum.
Bu Derleyiciler çalıştım:
- GCC 4.9.2-Duvar-WExtra
- Microsoft tüm uyarıları ile C 2013 Visual sağladı
CEVAP
Bu değişkeni başlatılmadı açıklık abartılmıştır. Path analizi zaman ve derleyici satıcınıza ya da özellik uygulamak istemedi ya da çok fazla zaman mal olacak, diye düşündüm maliyetleri ya da sadece açıkça tercih etmedi.
clang
örneğin:
$ clang -Wall -Wextra -c obvious.c
$ clang -Wall -Wextra --analyze -c obvious.c
obvious.c:9:11: warning: The right operand of '<' is a garbage value
if (2 < totaldiff) // at this point totaldiff is not initialized
^ ~~~~~~~~~
obvious.c:16:21: warning: The left operand of '==' is a garbage value
return tauxtrouve == tauxprecis ; // at this point tauxtrouve is potentially
~~~~~~~~~~ ^
2 warnings generated.
Bu naif örnekler için yürütme zamanı arasındaki fark önemsİzdİr. Ama satırları binlerce, on fonksiyonları, döngüler ve ağır bir çeviri birimi yerleştirme düşünün. Yollar sayısı hızla ve atama bu karşılaştırma öncesinde gerçekleşecek olup, döngünün ilk yineleme olmadığını analiz etmek için büyük bir yük bileşikler haline gelir.
EDİT: Matthieu/çınlama LLVM ile, yol analizi değer yuvalama arttıkça bileşik kullanmaz-başlatılmamış bulmak için özel AJAN gösterim IR kullandığından gerekli. puan @
Umduğum gibi", ama nitelendirdi özel AJAN gösterimde çıkış buldum. "-S -emit-llvm
kadar basit değildi Dürüst olacağım, LLVM IR ile emin olmak için yeterince aşina değilim, ama bunun için Matthieu sözü ben alayım.
Sonuç: --analyze
clang
gcc
hatayı düzeltmek için birini ikna etmek.
; Function Attrs: nounwind uwtable
define i32 @NearEqual(i32 %tauxprecis, i32 %max, i32 %value) #0 {
br label %1
; <label>:1 ; preds = %7, %0
%tauxtrouve.0 = phi i32 [ undef, %0 ], [ %tauxtrouve.1, %7 ]
%i.0 = phi i32 [ 0, %0 ], [ %8, %7 ]
%2 = icmp slt i32 %i.0, %max
br i1 %2, label %3, label %9
; <label>:3 ; preds = %1
%4 = icmp slt i32 2, 2
br i1 %4, label %5, label %6
; <label>:5 ; preds = %3
br label %6
; <label>:6 ; preds = %5, %3
%tauxtrouve.1 = phi i32 [ %value, %5 ], [ %tauxtrouve.0, %3 ]
br label %7
; <label>:7 ; preds = %6
%8 = add nsw i32 %i.0, 1
br label %1
; <label>:9 ; preds = %1
= icmp eq i32 %tauxtrouve.0, %tauxprecis
= zext i1 to i32
ret i32
}
Nasıl yerel değişken bilgi (adres ve t...
Neden Java derleyici bu değişken her z...
C ilan, başlatılmamış bir değişken ne ...
Başlatılmamış yerel değişken hızlı ras...
İçinde bir değişken durum olmadığını b...