警告 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.
// ...
}