Ringkasan :
Haruskah fungsi dalam C selalu memeriksa untuk memastikan itu bukan dereferencing NULL
pointer? Jika tidak, kapan tepat untuk melewatkan cek ini?
Detail :
Saya telah membaca beberapa buku tentang wawancara pemrograman dan saya bertanya-tanya apa tingkat validasi input yang sesuai untuk argumen fungsi di C? Jelas setiap fungsi yang mengambil input dari pengguna perlu melakukan validasi, termasuk memeriksa NULL
pointer sebelum mendereferensi itu. Tapi bagaimana dengan fungsi dalam file yang sama yang Anda tidak harapkan untuk mengekspos melalui API Anda?
Sebagai contoh, yang berikut ini muncul dalam kode sumber git:
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;
}
Jika *graph
adalah NULL
maka pointer null akan dereferenced, mungkin menerjang program, tetapi mungkin menyebabkan beberapa perilaku tak terduga lainnya. Di sisi lain fungsinya static
dan jadi mungkin programmer sudah memvalidasi input. Saya tidak tahu, saya hanya memilihnya secara acak karena itu adalah contoh singkat dalam program aplikasi yang ditulis dalam C. Saya telah melihat banyak tempat lain di mana pointer digunakan tanpa memeriksa NULL. Pertanyaan saya secara umum tidak spesifik untuk segmen kode ini.
Saya melihat pertanyaan serupa yang diajukan dalam konteks pemberian pengecualian . Namun, untuk bahasa yang tidak aman seperti C atau C ++ tidak ada propagasi kesalahan otomatis dari pengecualian yang tidak ditangani.
Di sisi lain saya telah melihat banyak kode dalam proyek open source (seperti contoh di atas) yang tidak melakukan pemeriksaan pointer sebelum menggunakannya. Saya bertanya-tanya apakah ada yang memiliki pemikiran tentang pedoman kapan harus melakukan cek dalam suatu fungsi vs dengan asumsi bahwa fungsi itu dipanggil dengan argumen yang benar.
Saya tertarik pada pertanyaan ini secara umum untuk menulis kode produksi. Tetapi saya juga tertarik dengan konteks wawancara pemrograman. Misalnya banyak buku teks algoritma (seperti CLR) cenderung menyajikan algoritma dalam pseudocode tanpa pengecekan kesalahan. Namun, meskipun ini bagus untuk memahami inti dari suatu algoritma, itu jelas bukan praktik pemrograman yang baik. Jadi saya tidak ingin memberi tahu pewawancara bahwa saya melewatkan pengecekan kesalahan untuk menyederhanakan contoh kode saya (seperti buku teks). Tetapi saya juga tidak ingin muncul untuk menghasilkan kode yang tidak efisien dengan pengecekan kesalahan yang berlebihan. Misalnya graph_get_current_column_color
bisa dimodifikasi untuk memeriksa *graph
nol tetapi tidak jelas apa yang akan dilakukan jika *graph
itu nol, selain itu tidak boleh dereferensi.