警告 C6031
忽略傳回值:'called-function' 可能傳回非預期的值
備註
警告 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.
// ...
}