Esta clasificación se basa en parte en opiniones; puede implicar que cualquier operación que no dé lugar a fallos del programa, fallas de seguridad u otras fallas obvias es legítima y no necesita ser considerada un error, o puede implicar que cualquier incumplimiento de la intención explícita del programador (como se comunica a través de anotaciones mecanografiadas) sea errónea y no "a prueba de tipos".
El requisito preciso es más sutil que esto: consulte subtipado y polimorfismo.
, si ese lenguaje permite que los datos se copien en una variable de tipo
Cada vez que se crea un nuevo objeto, cumplirá con ese contrato.
Cada función que intercambia objetos derivados de una clase específica, o que implementa una interfaz específica, se adherirá a ese contrato: por lo tanto, en esa función las operaciones permitidas en ese objeto serán solo aquellas definidas por los métodos de la clase que el objeto implementa.
El lenguaje de programación SPARK es un subconjunto de Ada que elimina todas sus posibles ambigüedades e inseguridades y, al mismo tiempo, agrega contratos verificados estáticamente a las características del lenguaje disponibles.
SPARK evita los problemas con los punteros colgantes al no permitir la asignación en tiempo de ejecución por completo.
Algo como printf("%s", 12), que le dice a la función que espere un puntero a una cadena de caracteres y aun así proporciona un argumento entero, puede ser aceptado por los compiladores, pero producirá resultados indefinidos.
Además, C, como Ada, proporciona conversiones explícitas no especificadas o indefinidas; ya diferencia de Ada, los modismos que usan estas conversiones son muy comunes y han ayudado a darle a C una reputación de tipo inseguro.
Tiene soporte para punteros sin tipo, pero se debe acceder a esto usando la palabra clave unsafe.
En este caso, si la división no tiene representación finita, como cuando se calcula, por ejemplo, 1/3 = 0.33333 ..., el método divide () puede generar una excepción si no se define un modo de redondeo para la operación.
SML tiene una semántica rigurosamente definida y se sabe que es de tipo seguro.
Sin embargo, algunas implementaciones de SML, incluido el estándar ML de Nueva Jersey (SML / NJ), su variante sintáctica Mythryl y Mlton, proporcionan bibliotecas que ofrecen ciertas operaciones inseguras.
Otro ejemplo es el alto nivel interactivo SML / NJ en sí mismo, que debe usar operaciones inseguras para ejecutar el código ML ingresado por el usuario.
Esto se logra "moviendo" dichas instalaciones a una pseudo-librería incorporada llamada SYSTEM desde donde deben importarse antes de que puedan usarse.
Sin embargo, otras instalaciones inseguras, como registros variantes, permanecieron disponibles sin ninguna importación desde el pseudo-módulo SYSTEM.
[12]Una revisión reciente del lenguaje aplicó rigurosamente la filosofía de diseño original.
En primer lugar, se cambió el nombre del pseudo-módulo SYSTEM a UNSAFE para hacer más explícita la naturaleza insegura de las instalaciones importadas desde allí.
Cuando un compilador de Pascal dicta "tipificación estricta", dos variables no se pueden asignar entre sí a menos que sean compatibles (como la conversión de entero a real) o asignadas al subtipo idéntico.
Una asignación de T1 : = T2; sería legal porque los subtipos para los que están definidos son idénticos.
El problema podría haberse evitado escribiendo float fval = ival; El siguiente ejemplo muestra cómo las referencias a objetos se pueden reducir incorrectamente:Las dos clases secundarias tienen miembros de diferentes tipos.
En el ejemplo, esto lleva a que se imprima un valor basura.
El problema podría haberse evitado reemplazando static_cast con dynamic_cast que arroja una excepción en dynamic_cast no válidas.