Gran parte de mi experiencia es con sistemas relativamente restringidos, donde el código de hinchazón de este tipo es indeseable. Por lo tanto, mi instinto es usar aserciones solo de depuración o dejarlo fuera por completo. Es de esperar que se produzcan posibles entradas no válidas durante las pruebas de la persona que llama que le proporcione los valores incorrectos, por lo que siempre que realice una prueba en modo de depuración y en el modo de lanzamiento, verá los diagnósticos. De lo contrario, depurará el bloqueo cuando eventualmente ocurra.
Si el tamaño del código y el rendimiento no importan (y en casi todos los códigos, una simple comprobación nula o de rango no afectará el rendimiento), entonces cuanto más afirme dejar en el código en modo liberación, más posibilidades tener de diagnosticar fallas sin necesidad de volver a crear el error en el modo de prueba. Esto puede ser un gran ahorro de tiempo. En particular, si su producto es una biblioteca, una proporción significativa de los informes de "fallas" se deben a errores de los clientes, por lo que ninguna cantidad de pruebas preliminares puede evitar que ocurran en la naturaleza. Cuanto antes pueda demostrarle al cliente que su código es incorrecto, antes podrá solucionarlo y podrá volver a encontrar sus propios errores.
Aún así, en C/C++ encuentro que el caso específico de buscar nul punteros es solo una ayuda menor. Si alguien le pasa un puntero, entonces la condición de validez completa no es "no debe ser nula". Necesita apuntar a la memoria que es legible (quizás también escribible) por el proceso actual a un cierto tamaño, y contiene el tipo correcto de objeto, posiblemente en un cierto subconjunto de todos los estados posibles. No necesita haber sido liberado, no haber sido destruido por un buffer rebasado en otro lugar, probablemente no para ser modificado simultáneamente por otro hilo, etc. Usted no va a probar todo eso en la entrada del método, por lo que aún puede perder el inválido parámetros. Cualquier cosa que lo lleve a usted u otros programadores a pensar que "este puntero no es nulo, por lo que debe ser válido", porque ha probado solo una pequeña parte de la condición de validez, es engañoso.
Si pasa por un puntero, entonces ya se encuentra en un territorio donde debe confiar en que la persona que llama no le dé basura. Rechazar una instancia particular de basura todavía te deja confiando en que la persona que llama no te dé ninguna de la miríada de otras clases de basura que pueden evocar que son más difíciles de detectar.Si encuentra que los punteros nulos son un tipo común de basura de sus interlocutores en particular, entonces hágalo con toda sinceridad, ya que ahorra tiempo diagnosticando errores en otras partes del sistema. Depende de una evaluación de si encontrar errores en el código de la persona que llama con el síntoma "me pasa un puntero nulo", vale la pena hinchar tu propio código (quizás en tamaño binario, y ciertamente en el código fuente): si esos errores son raros, entonces tú " Probablemente esté perdiendo el tiempo y controle los bienes raíces para buscarlos.
Por supuesto, en algunos idiomas no se pasa por el puntero y la persona que llama tiene solo oportunidades limitadas de dañar la memoria, por lo que hay menos margen para la basura. Pero en Java, por ejemplo, pasar el objeto incorrecto sigue siendo un error de programación más común que pasar un nulo erróneo. En cualquier caso, los nulos suelen ser bastante fáciles de diagnosticar si los dejas en el tiempo de ejecución para detectarlos, y observas la pila de fichas. Entonces, el valor de la verificación nula es bastante limitado incluso allí. En C++ y C# puede usar pass-by-reference donde los nulos estarían prohibidos.
Lo mismo ocurre con cualquier otra entrada inválida específica que pueda probar, y en cualquier idioma. Las pruebas completas previas y posteriores a la condición (si es posible) son, por supuesto, otra cuestión, ya que si puede probar todo el contrato de llamadas, entonces estará en un terreno mucho más firme. Y si puede usar el tejido o lo que sea para afirmar contratos sin agregar al código fuente de la función en sí, eso es aún mejor.