Ostrzeżenie C6011
Wyłuszczenie wskaźnika NULL "pointer-name".
Uwagi
To ostrzeżenie wskazuje, że kod wyłusza potencjalnie wskaźnik o wartości null. Jeśli wartość wskaźnika jest nieprawidłowa, wynik jest niezdefiniowany. Aby rozwiązać ten problem, przed użyciem zweryfikuj wskaźnik.
Nazwa analizy kodu: DEREF_NULL_PTR
Przykład
Poniższy kod generuje to ostrzeżenie, ponieważ wywołanie malloc
metody może zwrócić wartość null, jeśli jest dostępna niewystarczająca ilość pamięci:
#include <malloc.h>
void f( )
{
char *p = ( char * ) malloc( 10 );
*p = '\0';
// code ...
free( p );
}
Aby poprawić to ostrzeżenie, sprawdź wskaźnik dla wartości null, jak pokazano w poniższym kodzie:
#include <malloc.h>
void f( )
{
char *p = ( char * )malloc ( 10 );
if ( p )
{
*p = '\0';
// code ...
free( p );
}
}
Funkcje mogą mieć parametry z adnotacjami przy użyciu Null
właściwości w warunku Pre
. Przydziel pamięć wewnątrz tych funkcji przed wyłuszczeniem parametru. Poniższy kod generuje ostrzeżenie C6011, ponieważ podjęto próbę wyłudzenia wskaźnika o wartości null (pc
) wewnątrz funkcji bez uprzedniego przydzielenia pamięci:
#include <sal.h>
using namespace vc_attributes;
void f([Pre(Null=Yes)] char* pc)
{
*pc='\0'; // warning C6011 - pc is null
// code ...
}
Nieostrogowe malloc
użycie i free
prowadzi do przecieków pamięci i wyjątków. Aby zminimalizować te rodzaje przecieków i problemów z wyjątkami, należy unikać samodzielnego przydzielania nieprzetworzonej pamięci. Zamiast tego należy użyć mechanizmów udostępnianych przez standardową bibliotekę języka C++ (STL). Należą do nich shared_ptr
: , unique_ptr
i vector
. Aby uzyskać więcej informacji, zobacz Inteligentne wskaźniki i Standardowa biblioteka języka C++.
Algorytmy heurystyczne
Heurystyczny używany do zmniejszenia liczby ostrzeżeń w starszym kodzie zakłada, że wskaźnik nie jest -NULL
chyba że istnieją dowody, że jest NULL
to . W przykładach, które widzieliśmy do tej pory, wskaźniki zwrócone przez malloc
lub new
mogą być NULL
spowodowane niepowodzeniem alokacji. Inną cechą, która jest używana przez aparat analizy jako dowód wartości null, jest to, czy program jawnie sprawdza wartość NULL
. Przedstawiono to w następujących przykładach:
void f(int* n)
{
*n = 1; // Does not warn, n is assumed to be non-null
}
void f(int* n)
{
if (n) {
(*n)++;
}
*n = 1; // Warns because the earlier conditional shows that n might be null
}
W drugim przypadku użytkownik może naprawić ostrzeżenie, przenosząc *n = 1
wiersz wewnątrz bloku if.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla