, VC++

5

bir kod parçası olan başlatılmamış bir değişken kullanılıyor olduğu açıktır, VC++

#include <iostream> 

void foo(int *a) 
{ 
    std::cout<<*a<<std::endl; 
} 

int main() 
{ 
    int i; 
    foo(&i); 
} 

başlatılmamış değişken belirler.

/RTCu'u denedim, ayrıca error C4700'a dayandırdım, ancak yukarıdaki kod için derleyici bir hata olarak işaretlemiyor. Ayrıca Kod Analizi çalışan çalıştı

, hiç sorunları var kod parçası olarak rapor ısırdı.

Yani bizim kaynak kodunda başlatılmamış değişkenleri belirlemek için güvenilir yolu nedir?

Biliyorum valgrind harika bir JOB işte burada ama Windows API'ları ve MFC çağrıları çok olduğu için benim için bir seçenek değil.

+2

Size "bariz" olduğunu ancak derleyici: Bir işaretçi dolaylama yoluyla (non-inline) işlevine değişken geçmek (işlev satır içi yapma ve satır içi uygulaması sağlayan gcc ile bir uyarı tetikleyecek yapar dikkat edin). Şimdi, bir cevap değil, neden başlangıçta başlatılmamış değişkenleri tanımlama? Sorunları önlemenin basit bir yolu, her zaman bir değişken tanımlarken onu tanımlamaktır (bu, onu başlatabilmeniz için onu tanımlamamak anlamına gelir). –

+0

@gx_: Başlatılmamış değişkenleri tanımlamıyorum ancak olası sorunlar için kod tabanını dazenfekte etmiyorum. Ayrıca ben buna katılmıyorum 'Size göre 'açık' değil ama derleyiciye '. Anladığım kadarıyla kanıtlamak için Valgrind'i yukarıdaki kod tabanı üzerinden çalıştırmalı ve yanıtını belirlemeliyim. – Abhijit

+0

Cevabınız için teşekkürler (“kodumdan değil” şüphesi vardı, ancak kesin olmayan bir şey olmadı). Ama ben koruyorum, derleyici için belli ki _not_; eğer olsaydı uyarırdı ('foo' satır içi ve _then_ derleyici için belirgin hale gelir). Ayrıca valgrind bir derleyici veya statik bir analiz aracı değil, bir _dynamic_ kontrolörüdür. –

cevap

1

başlatılmamış değişkenlerin tüm vakaları tesbit bir derleyici için güvenilir bir yolu yoktur. Valgrind (ve bunun gibi diğer araçları) yukarıda adı geçen kullanıcı gx gibi derleyiciler, ancak dinamik analiz araçları değildirler. Birimleştirilmiş değişkenlerin birçok kullanım durumunu tespit edebilen statik analiz araçları da vardır. Ancak genellikle derleyiciler bu özel araçlar için uygun değildir.

1

Statik analiz bölümü ile ilgili olarak: VS2013'ten itibaren, başka bir statik analiz aracına erişiminiz varsa, çok fazla yakalamak için varsayılan analizörlere güvenmem (başkalarının kaçırabileceği şeyleri yakalamak için VS kullanmak iyi olsa da)). Burada büyük olasılıkla olmasa da, statik analizcilerin birçok yerde gördükleri ya da diğer geliştiriciler tarafından kabul edilebilir norm olarak geçersiz kılınan kalıpları göz ardı edebileceğini unutmayın. Coverity bu davayı rapor etmeseydi şaşırırdım (üzgünüm, test için ATM'yi kurmadı). Bunu görmezden geldiyse, bir açıklama paylaşılan bir bellek adresi olarak düşünülebilirdi.

+0

Kapsam (en azından kurulumumda) bunu da yakalamadı. Görünüşe göre analizin fonksiyon derinliği çok kısıtlı. Başlatılmamış değişkenlerin diğer durumlarda, derleme süreci genellikle onu yakalar, yani belki de buna güvenirler. İlginç vaka tahmin edemezdi. – dwn

İlgili konular