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