次の方法で共有


警告 C6031

戻り値が無視されました: '呼び出された関数' が予期しない値を返した可能性があります

解説

警告 C6031 は、呼び出し元が失敗が起きていないか関数の戻り値を確認していないことを示します。 呼び出されている関数によっては、この障害によって、ランダムに発生しているように見えるプログラムの誤った動作の原因になる可能性があります。 これには、エラー状態やリソース不足状態でのクラッシュやデータの破損が含まれます。

一般に、ディスク、ネットワーク、メモリ、または他のリソースを必要とする関数の呼び出しが成功すると想定するのは危険です。 呼び出し元は常に戻り値を確認し、エラー ケースを適切に処理する必要があります。 また、値が便利な方法で検査されていることを確認する _Must_inspect_result_ 注釈を使用することも検討してください。

この警告は、C と C++ コードの両方に適用されます。

コード分析名: RETVAL_IGNORED_FUNC_COULD_FAIL

次のコードでは、警告 C6031 が発生します。

#include <stdio.h>
int main()
{
    fopen("test.c", "r"); // C4996, C6031 return value ignored
    // code ...
}

この警告を解決するには、次のコードに示すように、関数の戻り値を確認します。

#include <stdio.h>
int main()
{
    FILE* stream;
    if ((stream = fopen("test.c", "r")) == NULL)
    {
        return;
    }
    // code ...
}

次のコードでは、この警告を解決するために安全な関数 fopen_s を使用しています。

#include <stdio.h>
int main()
{
    FILE* stream;
    errno_t err;

    if ((err = fopen_s(&stream, "test.c", "r")) != 0)
    {
        // code ...
    }
}

この警告は、次のコードに示すように、呼び出し元が _Check_return_ プロパティで注釈が付けられた関数の戻り値を無視した場合にも生成されます。

#include <sal.h>
_Check_return_ bool func()
{
    return true;
}

int main()
{
    func();
}

前の警告を解決するには、次のコードに示すように戻り値を確認します。

#include <sal.h>
_Check_return_ bool func()
{
    return true;
}

int main()
{
    if (func())
    {
        // code ...
    }
}

関数の戻り値を無視する必要がある場合は、戻り値を std::ignore に割り当てます。 std::ignore に代入することで、開発者の意図が明確になり、今後のコード管理で役立ちます。

#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.
    // ... 
}

関連項目

fopen_s_wfopen_s
SAL 注釈を使ってコード障害を減らす方法