Підсумок :
Чи повинна функція в С завжди перевіряти, щоб вона не перенаправляла NULL
покажчик? Якщо ні, коли доцільно пропустити ці чеки?
Деталі :
Я читав кілька книг про інтерв'ю з програмуванням і мені цікаво, яка відповідна ступінь перевірки вхідних даних для аргументів функції в C? Очевидно, що будь-яка функція, яка приймає дані від користувача, повинна здійснити перевірку, включаючи перевірку на NULL
покажчик перед тим, як відкинути його. А як бути у випадку функції у тому самому файлі, який ви не очікуєте відкрити через API?
Наприклад, наступний з'являється у вихідному коді мерзотника:
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;
}
Якщо *graph
є , NULL
то покажчик нуля буде разименовиваются, ймовірно , збоєм програми, але , можливо , в результаті якого - небудь інше непередбачуваної поведінки. З іншого боку, функція є, static
і, можливо, програміст вже підтвердив вхід. Я не знаю, я просто вибрав його навмання, тому що це був короткий приклад програми програми, написаної на C. Я бачив багато інших місць, де використовуються покажчики, не перевіряючи NULL. Моє запитання взагалі не стосується цього кодового сегмента.
Я бачив подібне запитання, яке задавали в контексті передачі виключень . Однак для небезпечної мови, такої як C або C ++, немає автоматичного розповсюдження помилок непоправлених винятків.
З іншого боку, я бачив безліч кодів у проектах з відкритим кодом (наприклад, у наведеному вище прикладі), який не робить перевірки покажчиків перед їх використанням. Мені цікаво, чи хтось має думки щодо вказівок, коли слід перевіряти функцію проти того, якщо припустити, що функція викликалася правильними аргументами.
Мене це питання взагалі цікавить для написання виробничого коду. Але мені також цікаво в інтерв'ю програмування. Наприклад, багато підручників алгоритмів (наприклад, CLR) прагнуть представляти алгоритми в псевдокоді без перевірки помилок. Однак, хоча це добре для розуміння ядра алгоритму, це, очевидно, не є хорошою практикою програмування. Тому я не хотів би сказати інтерв'юеру, що я пропускаю перевірку помилок, щоб спростити приклади коду (як це може бути підручник). Але я також не хотів би видаватись неефективним кодом із надмірною перевіркою помилок. Наприклад, graph_get_current_column_color
міг бути модифікований, щоб перевірити *graph
наявність null, але не зрозуміло, що воно буде робити, якщо *graph
було б null, окрім цього воно не повинно зневажати його.