Предупреждение C26862
Объект
var
date-time был создан из другого типа объекта даты и времени, но преобразование было неполным: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++
правил для выполнения".