次の方法で共有


警告 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