警告 C26863
會忽略日期時間處理函
func
式的傳回值
此規則已在 Visual Studio 2022 17.8 中新增。
備註
請務必確認函式的傳回值,這個函式會在沒有適當的閏年處理的情況下操作年、月或日期輸入自變數時轉換日期結構。 否則,函式可能會失敗,且執行會繼續執行包含無效數據的輸出參數。
以下是此警告涵蓋的函式清單:
FileTimeToSystemTime
SystemTimeToFileTime
SystemTimeToTzSpecificLocalTime
SystemTimeToTzSpecificLocalTimeEx
TzSpecificLocalTimeToSystemTime
TzSpecificLocalTimeToSystemTimeEx
RtlLocalTimeToSystemTime
RtlTimeToSecondsSince1970
程式代碼分析名稱: DATETIME_MANIPULATION_FUNCTION_RETURN_IGNORED
範例
下列程式代碼會嘗試取得目前的系統時間、將月份欄位前移一個月,並透過取得對應至更新系統時間的檔案時間 SystemTimeToFileTime
。 不過, SystemTimeToFileTime
可能會失敗,因為更新的系統時間可能會變成無效:
#include <Windows.h>
void foo()
{
FILETIME ft;
SYSTEMTIME st;
GetSystemTime(&st);
st.wMonth++; // Advance month by one
// Get the file time
SystemTimeToFileTime(&st, &ft); // C26863
}
若要修正此問題,請一律檢查日期時間操作函式的傳回值,並適當地處理失敗:
#include <Windows.h>
void foo()
{
FILETIME ft;
SYSTEMTIME st;
GetSystemTime(&st);
st.wMonth++; // Advance month by one
// Get file time
if (SystemTimeToFileTime(&st, &ft))
{
// Use file time
}
}
啟發學習法
此規則只會辨識 Windows SYSTEMTIME
結構與 C tm
結構。
不論在呼叫這些函式之前是否已驗證輸入自變數,都會強制執行此規則。 如果在呼叫函式之前驗證所有輸入自變數,此規則可能會報告 false 警告。
此規則是加入加入規則,這表示程式代碼分析應該使用規則集檔案,而且規則應該明確包含在規則集檔案中,並啟用規則以套用規則集檔案。 如需建立程式代碼分析自定義規則集的詳細資訊,請參閱 使用規則集指定要 C++
執行的規則。