Udostępnij za pośrednictwem


Ostrzeżenie C26862

Obiekt var daty i godziny został utworzony na podstawie innego typu obiektu daty i godziny, ale konwersja nie została ukończona: expr

Ta reguła została dodana w programie Visual Studio 2022 17.8.

Uwagi

Właściwe wymuszanie reguł obsługi roku przestępnego i dni przestępnych wymaga śledzenia właściwej konwersji między obiektami daty i godziny różnych typów, takich jak struktura systemu Windows SYSTEMTIME i struktura C tm . Różne typy daty i godziny mogą mieć różne podstawy dla pól roku, miesiąca i dnia. Na przykład SYSTEMTIME ma pola 0 lat, ale 1 miesiąc i dzień. Z drugiej strony, tm ma 1900 lat, 0-oparty miesiąc i 1-dniowe pola. Aby przekonwertować obiekt jednego z tych typów na obiekt innego typu, należy odpowiednio dostosować pola roku, miesiąca i dnia.

Nazwa analizy kodu: INCOMPLETE_DATETIME_CONVERSION

Przykład

Poniższy kod próbuje przekonwertować wystąpienie tm klasy na wystąpienie SYSTEMTIMEklasy . Powoduje to niezbędne dostosowanie pola roku, ale nie odpowiednio dostosowuje pola miesiąca:

#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; 
} 

Aby rozwiązać ten problem, dostosuj pola miesiąca i roku:

#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; 
} 

Algorytmy heurystyczne

Ta reguła rozpoznaje tylko strukturę systemu Windows SYSTEMTIME i strukturę języka C tm .

Ta reguła jest regułą zgody, co oznacza, że analiza kodu powinna używać pliku zestawu reguł, a reguła powinna zostać jawnie dołączona do pliku zestawu reguł i włączona, aby została zastosowana. Aby uzyskać więcej informacji na temat tworzenia niestandardowego zestawu reguł na potrzeby analizy kodu, zobacz Używanie zestawów reguł do określania C++ reguł do uruchomienia.

Zobacz też

C6393
C6394
C26861
C26863
C26864