Regla NullCheck (storport)
La regla NullCheck comprueba que un valor NULL dentro del código de controlador no se desreferencia más adelante en el controlador. Esta regla notifica un defecto si se cumple alguna de estas condiciones:
- Hay una asignación de NULL que se desreferencia más adelante.
- Hay un parámetro global o un procedimiento en un controlador que puede ser NULL que se desreferencia más adelante y hay una comprobación explícita en el controlador que sugiere que el valor inicial del puntero puede ser NULL.
Con las infracciones de la regla NullCheck, las instrucciones de código más relevantes se resaltan en el panel del árbol de seguimiento. Para obtener más información sobre cómo trabajar con la salida del informe, vea Informe de comprobador de controladores estáticos y Descripción del Visor de seguimiento.
Ejemplo de estructura
Este fragmento de código muestra el uso adecuado de una estructura.
//Rule does not fail
typedef struct _B {
int *f;
} B;
void GoodStruc(B *x) {
B *y = x;
y->f = NULL; //assign NULL
if (x->f) {
*(x->f) = 1;
} //OK
}
Este fragmento de código muestra el uso incorrecto de una estructura. El código se compilará, pero producirá un error en tiempo de ejecución.
//Rule fails
typedef struct _A {
int *f;
} A;
void BadStruc(A *x) {
A *y = x;
y->f = NULL; //assign NULL
*(x->f) = 1; //dereferencing NULL
}
Ejemplo de función
En este ejemplo, hay un parámetro para una función que puede ser NULL, que se desreferencia más adelante. Además, hay una comprobación explícita que sugiere que el valor inicial del puntero puede ser NULL.
//Rule fails
void Bad(int *x)
{
*x = 2; //Possibly dereferencing NULL
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
En este ejemplo, no hay ninguna infracción de regla, ya que es probable que haya una condición previa implícita de que el parámetro no se espera que sea NULL.
//Rule does not fail
void Good1(int *x)
{
*x = 2;
*x = *x + 1;
}
En este segundo ejemplo, hay una comprobación explícita de NULL cada vez que se usa el parámetro .
//Rule does not fail
void Good2(int *x)
{
if (x != NULL)
*x = 2; // ok
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
Modelo de controlador: Storport
Cómo probar
En tiempo de compilación |
---|
Ejecute el Comprobador de controladores estáticos y especifique la regla NullCheck . Usa los pasos siguientes para ejecutar un análisis de tu código:
Para obtener más información, vea Usar comprobador de controladores estáticos para buscar defectos en controladores. |