Özet :
C'deki bir işlev her zaman bir NULL
işaretçiyi kaydı silip etmediğinden emin olmalıdır mı? Değilse, bu kontrolleri atlamak ne zaman uygundur?
Ayrıntılar :
Röportajları programlama hakkında bazı kitaplar okudum ve C'deki işlev argümanları için uygun giriş doğrulama derecesinin ne olduğunu merak ediyorum? Açıkçası, bir kullanıcıdan girdi alan herhangi bir fonksiyonun, NULL
kayıttan çıkarılmadan önce bir işaretçi kontrolü de dahil olmak üzere, doğrulama gerçekleştirmesi gerekir. Ancak, aynı dosyadaki API'nız aracılığıyla göstermeyi beklemediğiniz bir işlev durumunda ne olacak?
Örneğin git kaynak kodunda aşağıdakiler görünür:
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!want_color(graph->revs->diffopt.use_color))
return column_colors_max;
return graph->default_column_color;
}
Eğer *graph
bir NULL
sonra bir boş gösterici muhtemelen programı kilitleniyor, ama muhtemelen diğer bazı öngörülemeyen davranışlara sonuçlanan indirgenmedikleri edilecektir. Öte yandan işlev static
ve böylece programcı girişi zaten doğrulamıştır. Bilmiyorum, sadece rastgele seçtim çünkü C ile yazılmış bir uygulama programında kısa bir örnekti. İşaretçilerin NULL kontrol edilmeden kullanıldığı birçok başka yer gördüm. Sorum genel bu kod segmentine özgü değil.
İstisna teslimi bağlamında da benzer bir soru sordum . Ancak, C veya C ++ gibi güvenli olmayan bir dil için, işlenmeyen istisnaların otomatik hata yayılımı yoktur.
Öte yandan, açık kaynak projelerinde (yukarıdaki örnek gibi) bunları kullanmadan önce işaretçi kontrolü yapmayan birçok kod gördüm. Herkes bir işleve ne zaman kontrol koymak için işlevin doğru argümanlar ile çağrıldığını varsayarak yönergeleri hakkında düşünceleri olup olmadığını merak ediyorum.
Bu soruyla genel olarak üretim kodu yazmakla ilgileniyorum. Ama aynı zamanda programlama görüşmeleri bağlamıyla da ilgileniyorum. Örneğin, birçok algoritma ders kitabı (CLR gibi) algoritmaları hata denetimi olmaksızın sahte kodda sunma eğilimindedir. Bununla birlikte, bu bir algoritmanın çekirdeğini anlamak için iyi olsa da, açıkçası iyi bir programlama uygulaması değildir. Bu yüzden bir röportajcıya kod örneklerimi basitleştirmek için hata kontrolünü atladığımı söylemek istemezdim (ders kitabının yapabileceği gibi). Ama aynı zamanda aşırı hata kontrolü ile verimsiz kod üretmek gibi görünmek istemem. Örneğin , null olup olmadığını graph_get_current_column_color
kontrol etmek *graph
için değiştirilmiş olabilirdi, ancak *graph
null olması gerekmemesi dışında, null olursa ne yapacağını açık değil.