Ostrzeżenie C6031
Wartość zwracana zignorowana: "called-function" może zwrócić nieoczekiwaną wartość
Uwagi
Ostrzeżenie C6031 wskazuje, że obiekt wywołujący nie sprawdza zwracanej wartości funkcji pod kątem niepowodzenia. W zależności od tego, która funkcja jest wywoływana, ta wada może prowadzić do pozornie losowego niewłaściwego zachowania programu. Obejmuje to awarie i uszkodzenia danych w warunkach błędów lub w sytuacjach o niskim zasobie.
Ogólnie rzecz biorąc, nie można założyć, że wywołania funkcji wymagających dysku, sieci, pamięci lub innych zasobów powiedzie się. Obiekt wywołujący powinien zawsze sprawdzać wartość zwracaną i odpowiednio obsługiwać przypadki błędów. Rozważ również użycie adnotacji _Must_inspect_result_
, która sprawdza, czy wartość jest badana w przydatny sposób.
To ostrzeżenie dotyczy zarówno kodu C, jak i C++.
Nazwa analizy kodu: RETVAL_IGNORED_FUNC_COULD_FAIL
Przykład
Poniższy kod generuje ostrzeżenie C6031:
#include <stdio.h>
int main()
{
fopen("test.c", "r"); // C4996, C6031 return value ignored
// code ...
}
Aby poprawić to ostrzeżenie, sprawdź wartość zwracaną funkcji, jak pokazano w poniższym kodzie:
#include <stdio.h>
int main()
{
FILE* stream;
if ((stream = fopen("test.c", "r")) == NULL)
{
return;
}
// code ...
}
Poniższy kod używa funkcji safe, fopen_s
aby poprawić to ostrzeżenie:
#include <stdio.h>
int main()
{
FILE* stream;
errno_t err;
if ((err = fopen_s(&stream, "test.c", "r")) != 0)
{
// code ...
}
}
To ostrzeżenie jest również generowane, jeśli obiekt wywołujący ignoruje wartość zwracaną funkcji z adnotacją z właściwością _Check_return_
, jak pokazano w poniższym kodzie.
#include <sal.h>
_Check_return_ bool func()
{
return true;
}
int main()
{
func();
}
Aby poprawić poprzednie ostrzeżenie, sprawdź wartość zwracaną, jak pokazano w poniższym kodzie:
#include <sal.h>
_Check_return_ bool func()
{
return true;
}
int main()
{
if (func())
{
// code ...
}
}
W przypadkach, gdy konieczne jest zignorowanie zwracanej wartości funkcji, przypisz zwróconą wartość do std::ignore
. Przypisywanie do std::ignore
wyraźnie wskazuje intencję dewelopera i pomaga w przyszłej konserwacji kodu.
#include <tuple>
#include <ctime>
#include <cstdlib>
#include <stdio.h>
int main()
{
std::srand(static_cast<unsigned int>(std::time(nullptr))); // set initial seed value to system clock
std::ignore = std::rand(); // Discard the first result as the few random results are always small.
// ...
}
Zobacz też
fopen_s
, _wfopen_s
Używanie adnotacji SAL w celu zmniejszenia liczby wad kodu