Warnung C26862

Ein Datum-Uhrzeit-Objekt var wurde aus einem anderen Typ von Datum-Uhrzeit-Objekt erstellt, die Konvertierung war jedoch unvollständig: expr

Diese Regel wurde in Visual Studio 2022 17.8 hinzugefügt.

Hinweise

Die ordnungsgemäße Erzwingung von Regeln für die Behandlung von Schaltjahren und Schalttags erfordert das Nachverfolgen der richtigen Konvertierung zwischen Datums-/Uhrzeitobjekten verschiedener Typen wie der Windows-Struktur SYSTEMTIME und der C-Struktur tm . Unterschiedliche Datums-/Uhrzeittypen können unterschiedliche Basisen für die Felder "Jahr", "Monat" und "Tag" aufweisen. Beispielsweise SYSTEMTIME enthält ein 0-basiertes Jahr, aber 1-basierte Monats- und Tagesfelder. Auf der anderen Seite tm gibt es ein 1900-basiertes Jahr, einen 0-basierten Monat und ein 1-basiertes Tag-Feld. Um ein Objekt eines dieser Typen in ein Objekt eines anderen Typs zu konvertieren, müssen die Felder "Jahr", "Monat" und "Tag" entsprechend angepasst werden.

Codeanalysename: INCOMPLETE_DATETIME_CONVERSION

Beispiel

Der folgende Code versucht, eine Instanz von in eine Instanz von tm SYSTEMTIME. Sie nimmt die erforderliche Anpassung an das Feld "Jahr" vor, passt aber das Feld "Monat" nicht ordnungsgemäß an:

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

Um dieses Problem zu beheben, passen Sie die Felder "Monat" und "Jahr" an:

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

Heuristik

Diese Regel erkennt nur die Windows-Struktur SYSTEMTIME und die C-Struktur tm .

Diese Regel ist eine Opt-In-Regel, d. h. die Codeanalyse sollte eine Regeldatei verwenden, und die Regel sollte explizit in die Regeldatei aufgenommen und aktiviert werden, damit sie angewendet werden kann. Weitere Informationen zum Erstellen eines benutzerdefinierten Regelsets für die Codeanalyse finden Sie unter Verwenden von Regelsätzen zum Angeben der C++ auszuführenden Regeln.

Siehe auch

C6393
C6394
C26861
C26863
C26864