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 SYSTEMTIME
klasy . 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.