警告 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++
ルールを指定するを参照してください。