Warning C26862
A date-time object
var
has been created from a different type of date-time object but conversion was incomplete:expr
This rule was added in Visual Studio 2022 17.8.
Remarks
Proper enforcement of leap year and leap day handling rules require tracking the proper conversion between date-time objects of different types such as the Windows SYSTEMTIME
struct and the C tm
struct. Different date-time types may have different bases for the year, month, and day fields. For example, SYSTEMTIME
has a 0-based year, but 1-based month and day fields. On the other hand, tm
has a 1900-based year, a 0-based month, and a 1-based day fields. To convert an object of one of these types to an object of another type, the year, month, and day fields must be adjusted appropriately.
Code analysis name: INCOMPLETE_DATETIME_CONVERSION
Example
The following code tries to convert an instance of tm
into an instance of SYSTEMTIME
. It makes the necessary adjustment to the year field, but doesn't properly adjust the month field:
#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;
}
To fix this problem, adjust the month and year fields:
#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;
}
Heuristics
This rule only recognizes the Windows SYSTEMTIME
struct and the C tm
struct.
This rule is an opt-in rule, meaning that code analysis should use a ruleset file, and the rule should be explicitly included in the ruleset file, and enabled for it to be applied. For more information on creating a custom ruleset for code analysis, see Use Rule Sets to Specify the C++
Rules to Run.