Поделиться через


Предупреждение 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++ правил для выполнения".

См. также

C6393
C6394
C26861
C26863
C26864