分享方式:


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

另請參閱

fopen_s, _wfopen_s
使用 SAL 註釋減少程式碼瑕疵