Udostępnij za pośrednictwem


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