Splint usa el tutorial básico

  

a.splint introduce splint es una herramienta para verificar de manera estática las debilidades de seguridad del programa C y los errores de escritura. Splint realiza una variedad de comprobaciones de rutina, incluidas variables no utilizadas, tipos inconsistentes, uso de variables no definidas, código no ejecutable, ignorar valores de retorno, rutas de ejecución no devueltas, bucles infinitos y más. Al mismo tiempo, al agregar información adicional al código fuente, permite verificaciones más potentes. La anotación es un comentario estilizado que asume una función de funciones, variables, parámetros y tipos en un archivo.

Dirección de descarga de la instalación de Second.plint:

http://www.splint.org/downloads/splint-3.1.2.src.tgz instalación del paquete fuente: # tar zxvf splint- 3.1.2.src.tgz # cd splint-3.1.2 # mkdir /usr /local /splint # ./configure --prefix = /usr /local /splint # make install # vi ~ /.bashrc add: export LARCH_PATH = /usr /local /splint /share /splint /libexport LCLIMPORTDIR = /usr /local /splint /share /splint /import # source ~ /.bashrc # export PATH = /usr /local /splint /bin /splint: $ PATH tres El uso de .splint 1. Un error de referencia nula causa este error cuando se hace referencia a un puntero que no apunta a ninguna dirección de memoria. Es decir, se usa un puntero sin asignación. Splint admite un comentario especial. Este comentario está escrito en C. En el código del programa, se usa para especificar el programa. Por ejemplo, el siguiente programa usa /* @ null @ * /para indicar que el valor de * s puede ser NULL.

//Null.cchar firstChar1 (/* @ null @ * /char * s) {return * s;} char firstChar2 (/* @ null @ * /char * s) {if (s == NULL) return '\\ 0'; Return * s;} //END Al escanear este programa con una férula, se mostrará:

# splint null.c Férula 3.1.1 --- 28 de abril de 2005null.c: (en la función firstChar1) null.c: 3: 11: desreferencia de posiblemente el puntero nulo s: * s null.c: 1: 35: el almacenamiento s puede volverse nulo Comprobación finalizada - - 1 código de advertencia encontrado Ya que tanto firstChar1 como firstChar2 usan una descripción nula, lo que indica que el puntero s puede ser un valor NULO. Por lo tanto, la férula verifica el uso del valor de s. Debido a que la función firstChar2, el valor de s es NULL. Juez. Por lo tanto, no hay un mensaje de advertencia para el puntero de la función firstChar 2. 2. Error de variable no definida En el lenguaje C, la variable debe definirse antes de poder usarla. Por lo tanto, cuando se usa una variable que no está definida, el compilador Error. En el siguiente ejemplo, la variable descrita por /* @ in @ * /indica que se debe definir. La variable descrita por /* @ out @ * /indica que esta variable se ha definido después de que se haya ejecutado la función. Br>

//usedef.cextern void setVal (/* @ out @ * /int * x); extern int getVal (/* @ in @ * /int * x); extern int mysteryVal (int * x); Int dumbfunc (/* @ out @ * /int * x, int i) {if (i > 3) return * x; else if (i > 1) devuelve getVal (x); else if (i == 0 ) r Eturn mysteryVal (x); else {setVal (x); return * x;}} //END usa una férula para verificar usedef.c

$ splint usedef.cSplint 3.1.1 --- 28 de abril de 2005usedef.c : (en la función dumbfunc) usedef.c: 7: 19: valor * x usado antes de la definición Se usa un rvalue que puede no inicializarse a un valor en alguna ruta de ejecución.
(Use -usedef para inhibir la advertencia) usedef.c: 9 : 18: El almacenamiento pasado x no está completamente definido (* x no está definido): getVal (x) El almacenamiento se puede derivar de un parámetro, no se define el valor de retorno o global. Use /* @ out @ * /para decir almacenamiento pasado o devuelto que se necesita No se usa.
(Use -compdef para inhibir la advertencia) usedef.c: 11: 22: almacenamiento pasado x no completamente definido (* x no está definido): mysteryVal (x) Comprobación finalizada --- 3 advertencias de código //Como x no está definido en el programa, el error no está definido. Sin embargo, setVal () usa la descripción /* @ out @ * /, por lo que en setVal (x) y devuelve x;, no se informa de ningún error indefinido. El error de tipo C tiene más tipos de datos, y hay algunos matices entre ellos. La férula también puede El tipo está marcado.

Ejemplo 1:

//bool.cint f (int i, char * s, bool b1, bool b2) {if (i = 3) return b1; Si (! I | |  s) return i; if (s) return 7; if (b1 == b2) return 3; return 2;} //END se verifica mediante la férula:

$ splint bool.cSplint 3.1.1 - - 28 de abril de 2005bool.c: (en la función f) bool.c: 4: 5: Expresión de prueba para if es expresión de asignación: i = 3 La prueba de condición es una expresión de asignación. Probablemente, quiere usar == en lugar de = Si se pretende una asignación, agregue un paréntesis adicional que anide (por ejemplo, si ((a = b)) ...) para suprimir este mensaje.
(Use -predassign para inhibir la advertencia) //Causa: La condición en la declaración if La expresión es una declaración de asignación. Bool.c: 4: 5: Expresión de prueba para, si no es boolean, tipo int: i = 3 El tipo de expresión de prueba no es boolean o int.
(Use -predboolint para inhibir la advertencia) //Causa: El valor de retorno de la expresión condicional en la instrucción if, no es un valor booleano, sino un entero. Bool.c: 4: 8: el tipo de valor devuelto bool no coincide con el tipo declarado int: b1 Los tipos son incompatibles.
(Use -type para inhibir Advertencia) //Causa: el valor de retorno es booleano, no entero. Bool.c: 5: 6: El operando de! No es booleano (int): (Utilice -boolops para inhibir la advertencia) //Causa: el operando del operador "! &Quot; no es booleano Escriba, pero el entero i.bool.c: 5: 11: Operación derecha de | |  Es no booleano (char *):! I | |  s //Causa del error: " | | El operando derecho del operador " no es un valor booleano, sino un puntero de carácter. Bool.c: 7: 5: Uso de == con variables booleanas (riesgo de inconsistencias debido a múltiples valores verdaderos): b1 == b2 Dos valores bool son Esto puede producir resultados inesperados ya que todos los valores que no son cero se consideran verdaderos, por lo que diferentes valores verdaderos pueden no ser iguales. El archivo bool.h (incluido en splint /lib) proporciona bool_equal para comparaciones seguras de valores bool.
(Use -boolcompare para inhibir la advertencia) //Causa: use " == " para comparar dos tipos booleanos. Debe usar " &&" .Finalizando la comprobación --- 6 advertencias de código de ejemplo 2:

//malloc1.c#include < stdlib.h > #include < stdio.h > int main (void) {char * some_mem; int size1 = 1048576; some_mem = (char *) malloc ( Tamaño1); printf (" Malloed 1M Memory! \\ N "); free (some_mem); exit (EXIT_SUCCESS);} //END usa mallint para verificar malloc1.c

Copyright © Conocimiento de Windows All Rights Reserved