SORU
21 Kasım 2014, Cuma


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
21 Kasım 2014, Cuma


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 
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • MaximumPCMag

    MaximumPCMag

    23 Temmuz 2010