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.
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). –
@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
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. –