警告 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++
规则。