Advertencia C28182
Desreferenciación de un puntero null.
Información adicional: <pointer1> contiene el mismo valor NULL que <el puntero2> . <Nota>
La herramienta de análisis de código notifica esta advertencia cuando confirma que el puntero puede ser null. Si hay instancias no confirmadas en las que el error puede producirse anteriormente en el seguimiento, la herramienta de análisis de código agrega el número de línea de la primera instancia al mensaje de advertencia para que pueda cambiar el código a fin de abordar todas las instancias.
<pointer2> se confirma que posiblemente es null. <pointer1> contiene el mismo valor que pointer2 y se está desreferenciando. Dado que estos punteros pueden estar en diferentes lugares del código, ambos se notifican para que pueda determinar por qué la herramienta de análisis de código notifica esta advertencia.
Si existe una instancia anterior no confirmada de la condición, <note> se reemplaza por este texto: "Vea la línea <number> de una ubicación anterior en la que esto pueda producirse".
Ejemplos
En el ejemplo siguiente se muestra el código que podría provocar que la herramienta de análisis de código genere este mensaje de advertencia. En este ejemplo, la herramienta de análisis de código determina que pNodeFree
es null en la instrucción if
y se toma la ruta de acceso del código en el cuerpo de if
. Sin embargo, dado que nBlockSize
es potencialmente cero, el cuerpo de la for
instrucción no se ejecuta y pNodeFree
se deja sin modificar. Después, pNodeFree
se asigna a pNode
y pNode
se usa mientras podría producirse una desreferencia null.
typedef struct xlist {
struct xlist *pNext;
struct xlist *pPrev;
} list;
list *pNodeFree;
list *masterList;
int nBlockSize;
void fun()
{
if (pNodeFree == 0)
{
list *pNode = masterList;
for (int i = nBlockSize-1; i >= 0; i--, pNode--)
{
pNode->pNext = pNodeFree;
pNodeFree = pNode;
}
}
list* pNode = pNodeFree;
pNode->pPrev = 0;
}
La herramienta de análisis de código notifica la advertencia siguiente:
:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24
Una manera de corregir el ejemplo anterior es comprobar pNode
en busca de un cero antes de desreferenciarla, de modo que se evite una desreferencia null. En el código siguiente se muestra esta corrección.
typedef struct xlist {
struct xlist *pNext;
struct xlist *pPrev;
} list;
list *pNodeFree;
list *masterList;
int nBlockSize;
void fun()
{
if (pNodeFree == 0)
{
list *pNode = masterList;
for (int i = nBlockSize-1; i >= 0; i--, pNode--)
{
pNode->pNext = pNodeFree;
pNodeFree = pNode;
}
}
list* pNode = pNodeFree;
if(pNode != 0)
pNode->pPrev = 0;
}
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de