Avviso C26862
Un oggetto
var
data/ora è stato creato da un tipo diverso di oggetto data e ora, ma la conversione è incompleta:expr
Questa regola è stata aggiunta in Visual Studio 2022 17.8.
Osservazioni:
L'applicazione corretta delle regole di gestione bisestile e bisestile richiede il rilevamento della conversione corretta tra oggetti data e ora di tipi diversi, ad esempio lo struct di Windows SYSTEMTIME
e lo struct C tm
. Diversi tipi di data e ora possono avere basi diverse per i campi anno, mese e giorno. Ad esempio, SYSTEMTIME
ha un anno basato su 0, ma campi mese e giorno basati su 1. D'altra parte, tm
ha un anno basato su 1900, un mese basato su 0 e un campo di 1 giorno basato su 1. Per convertire un oggetto di uno di questi tipi in un oggetto di un altro tipo, i campi anno, mese e giorno devono essere modificati in modo appropriato.
Nome dell'analisi del codice: INCOMPLETE_DATETIME_CONVERSION
Esempio
Il codice seguente tenta di convertire un'istanza di tm
in un'istanza di SYSTEMTIME
. Apporta la rettifica necessaria al campo anno, ma non regola correttamente il campo mese:
#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;
}
Per risolvere il problema, modificare i campi mese e anno:
#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;
}
Euristica
Questa regola riconosce solo lo struct di Windows SYSTEMTIME
e lo struct C tm
.
Questa regola è una regola di consenso esplicito, ovvero l'analisi del codice deve usare un file del set di regole e la regola deve essere inclusa in modo esplicito nel file del set di regole e abilitata per l'applicazione. Per altre informazioni sulla creazione di un set di regole personalizzato per l'analisi del codice, vedere Usare set di regole per specificare le C++
regole da eseguire.