Tóm tắt :
Có nên kiểm tra một hàm trong C để đảm bảo rằng nó không bị hủy bỏ NULL
con trỏ không? Nếu không khi nào thì thích hợp để bỏ qua các kiểm tra này?
Chi tiết :
Tôi đã đọc một số cuốn sách về các cuộc phỏng vấn lập trình và tôi tự hỏi mức độ xác nhận đầu vào thích hợp cho các đối số chức năng trong C là gì? Rõ ràng bất kỳ chức năng nào nhận đầu vào từ người dùng cần thực hiện xác nhận, bao gồm kiểm tra một NULL
con trỏ trước khi hủy bỏ chức năng này. Nhưng trong trường hợp của một chức năng trong cùng một tệp mà bạn không mong đợi sẽ hiển thị thông qua API thì sao?
Ví dụ: phần sau xuất hiện trong mã nguồn của 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;
}
Nếu *graph
là NULL
sau đó một con trỏ null sẽ được dereferenced, có lẽ làm hỏng chương trình, nhưng có thể dẫn đến một số hành vi không thể đoán trước kia. Mặt khác, chức năng là static
và vì vậy có thể lập trình viên đã xác nhận đầu vào. Tôi không biết, tôi chỉ chọn nó một cách ngẫu nhiên vì đó là một ví dụ ngắn trong một chương trình ứng dụng được viết bằng C. Tôi đã thấy nhiều nơi khác sử dụng con trỏ mà không kiểm tra NULL. Câu hỏi của tôi là chung chung không cụ thể cho phân khúc mã này.
Tôi thấy một câu hỏi tương tự được hỏi trong bối cảnh bàn giao ngoại lệ . Tuy nhiên, đối với một ngôn ngữ không an toàn như C hoặc C ++, không có sự lan truyền lỗi tự động của các ngoại lệ chưa được xử lý.
Mặt khác, tôi đã thấy rất nhiều mã trong các dự án nguồn mở (như ví dụ ở trên) không thực hiện bất kỳ kiểm tra nào về con trỏ trước khi sử dụng chúng. Tôi tự hỏi liệu có ai có suy nghĩ về các hướng dẫn khi nào nên đặt kiểm tra trong một hàm so với giả sử rằng hàm đó được gọi với các đối số chính xác.
Tôi quan tâm đến câu hỏi này nói chung để viết mã sản xuất. Nhưng tôi cũng quan tâm đến bối cảnh phỏng vấn lập trình. Ví dụ, nhiều sách giáo khoa thuật toán (như CLR) có xu hướng trình bày các thuật toán trong mã giả mà không có bất kỳ kiểm tra lỗi nào. Tuy nhiên, trong khi điều này tốt cho việc hiểu cốt lõi của thuật toán thì rõ ràng nó không phải là một thực hành lập trình tốt. Vì vậy, tôi sẽ không muốn nói với một người phỏng vấn rằng tôi đã bỏ qua việc kiểm tra lỗi để đơn giản hóa các ví dụ mã của tôi (như một cuốn sách giáo khoa có thể). Nhưng tôi cũng không muốn xuất hiện để tạo mã không hiệu quả với việc kiểm tra lỗi quá mức. Ví dụ, graph_get_current_column_color
có thể đã được sửa đổi để kiểm tra *graph
null nhưng không rõ nó sẽ làm gì nếu *graph
là null, ngoài ra nó không nên hủy đăng ký.