Condividi tramite


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.

Vedi anche

C6393
C6394
C26861
C26863
C26864