分享方式:


警告 C26862

日期時間物件 var 已從不同類型的日期時間物件建立,但轉換不完整: expr

此規則已在 Visual Studio 2022 17.8 中新增。

備註

適當強制執行閏年和閏日處理規則需要追蹤不同類型日期時間對象之間的適當轉換,例如 Windows SYSTEMTIME 結構與 C tm 結構。 不同的日期時間類型對於年份、月和日欄位可能有不同的基底。 例如, SYSTEMTIME 有以 0 為基礎的年份,但以 1 為起始的月份和日欄位。 另一方面, tm 具有以 1900 為基礎的年份、以 0 為基礎的月份,以及以 1 為基底的日期字段。 若要將其中一個型別的對象轉換成另一種類型的對象,必須適當地調整年、月和日字段。

程式代碼分析名稱: INCOMPLETE_DATETIME_CONVERSION

範例

下列程式代碼會嘗試將的實例 tm 轉換成 的 SYSTEMTIME實例。 它會對年份欄位進行必要的調整,但未正確調整月份欄位:

#include <Windows.h>
#include <ctime>
  
void ConvertTmToSystemTime1b(const tm& tm) 
{ 
    SYSTEMTIME st; 
    st.wYear = tm.tm_year + 1900; 
    st.wMonth = tm.tm_mon; // C26862, Adjustment is missing 
    st.wDay = tm.tm_mday; 
} 

若要修正此問題,請調整月份和年份欄位:

#include <Windows.h> 
#include <ctime> 
  
void ConvertTmToSystemTime(const tm& tm) 
{ 
    SYSTEMTIME st; 
    st.wYear = tm.tm_year + 1900; 
    st.wMonth = tm.tm_mon + 1; 
    st.wDay = tm.tm_mday; 
} 

啟發學習法

此規則只會辨識 Windows SYSTEMTIME 結構與 C tm 結構。

此規則是加入加入規則,這表示程式代碼分析應該使用規則集檔案,而且規則應該明確包含在規則集檔案中,並啟用規則以套用規則集檔案。 如需建立程式代碼分析自定義規則集的詳細資訊,請參閱 使用規則集指定要 C++ 執行的規則。

另請參閱

C6393
C6394
C26861
C26863
C26864