Phần lớn kinh nghiệm của tôi là với các hệ thống tương đối bị hạn chế, trong đó mã bloat thuộc loại này là không mong muốn. Vì vậy bản năng của riêng tôi là sử dụng xác nhận chỉ gỡ lỗi hoặc để hoàn toàn loại bỏ nó. Bạn hy vọng rằng bất kỳ đầu vào không hợp lệ nào có thể xảy ra trong khi kiểm tra người gọi cung cấp cho bạn các giá trị không tốt, vì vậy miễn là bạn thử nghiệm ở chế độ gỡ lỗi cũng như chế độ phát hành, bạn sẽ thấy chẩn đoán. Nếu không, bạn sẽ gỡ lỗi sự cố khi nó xảy ra.
Nếu kích thước và hiệu suất mã không quan trọng (và trong hầu hết tất cả mã, kiểm tra khoảng trống hoặc dải ô đơn giản sẽ không ảnh hưởng đến hiệu suất), thì càng khẳng định bạn để lại mã trong chế độ phát hành thì càng có nhiều cơ hội có chẩn đoán lỗi mà không cần phải tạo lại lỗi trong chế độ thử nghiệm. Đây có thể là một tiết kiệm thời gian lớn. Đặc biệt, nếu sản phẩm của bạn là thư viện thì một tỷ lệ đáng kể các báo cáo "lỗi" là do lỗi của khách hàng, do đó không có số tiền kiểm tra trước khi phát hành có thể ngăn chúng xảy ra trong môi trường hoang dã. Bạn càng sớm có thể chứng minh với khách hàng rằng mã của họ là sai, họ càng sớm có thể sửa chữa nó và bạn có thể quay lại tìm lỗi của riêng bạn.
Tuy nhiên, trong C/C++ tôi thấy rằng trường hợp cụ thể của việc kiểm tra con trỏ null chỉ là một trợ giúp nhỏ. Nếu ai đó chuyển cho bạn một con trỏ, thì điều kiện hiệu lực đầy đủ không phải là "không được rỗng". Nó cần phải trỏ đến bộ nhớ có thể đọc được (có lẽ cũng có thể ghi) bởi quá trình hiện tại với kích thước nhất định và chứa đúng loại đối tượng, có thể trong một tập con nhất định của tất cả các trạng thái có thể. Nó không cần phải được giải phóng, không bị đụng chạm bởi một bộ đệm tràn ngập ở nơi khác, có thể không được đồng thời sửa đổi bởi một chủ đề khác, vv Bạn sẽ không kiểm tra tất cả những gì ở mục nhập, vì vậy bạn vẫn có thể bỏ lỡ thông số. Bất cứ điều gì dẫn bạn hoặc các lập trình viên khác nghĩ "con trỏ này không phải là rỗng vì vậy nó phải hợp lệ", bởi vì bạn đã thử nghiệm chỉ một phần nhỏ của điều kiện hợp lệ, là gây hiểu lầm.
Nếu bạn đang đi qua con trỏ, bạn đã ở trong lãnh thổ nơi bạn cần tin tưởng người gọi không cho bạn rác. Việc từ chối một trường hợp rác cụ thể vẫn khiến bạn tin tưởng người gọi không cho bạn bất kỳ loại rác nào khác mà họ có thể gợi ý khó phát hiện hơn.Nếu bạn thấy rằng con trỏ null là một loại rác phổ biến từ người gọi cụ thể của bạn, thì bằng mọi cách kiểm tra cho chúng, vì nó giúp tiết kiệm thời gian chẩn đoán lỗi ở những nơi khác trong hệ thống. Nó phụ thuộc vào việc đánh giá xem có phát hiện lỗi trong mã người gọi của bạn với dấu hiệu "truyền con trỏ null cho tôi" hay không, có giá trị mã của chính bạn (có lẽ ở kích thước nhị phân, và chắc chắn trong mã nguồn): có thể lãng phí thời gian và kiểm tra bất động sản trên màn hình cho họ.
Tất nhiên trong một số ngôn ngữ bạn không vượt qua bằng con trỏ và người gọi chỉ có cơ hội hạn chế để làm hỏng bộ nhớ, vì vậy có ít phạm vi hơn cho rác. Nhưng trong Java, ví dụ, vượt qua đối tượng sai vẫn là một lỗi lập trình phổ biến hơn là truyền một null sai. Nulls là trong mọi trường hợp thường khá dễ dàng để chẩn đoán nếu bạn để chúng vào thời gian chạy để phát hiện, và nhìn vào stacktrace. Vì vậy, giá trị của kiểm tra null là khá hạn chế ngay cả ở đó. Trong C++ và C# bạn có thể sử dụng pass-by-reference nơi null sẽ bị cấm.
Điều tương tự cũng xảy ra đối với bất kỳ đầu vào không hợp lệ cụ thể nào khác mà bạn có thể kiểm tra và bất kỳ ngôn ngữ nào. Kiểm tra trước và sau điều kiện đầy đủ (nếu có thể), tất nhiên là một vấn đề khác, vì nếu bạn có thể kiểm tra toàn bộ hợp đồng cuộc gọi thì bạn đang ở trên nền tảng vững chắc hơn nhiều. Và nếu bạn có thể sử dụng dệt hoặc bất cứ điều gì để khẳng định các hợp đồng mà không cần thêm vào mã nguồn của chính hàm đó, điều đó thậm chí còn tốt hơn.