Avertissement C26862

Un objet var date-heure a été créé à partir d’un autre type d’objet date-heure, mais la conversion a été incomplète : expr

Cette règle a été ajoutée dans Visual Studio 2022 17.8.

Notes

L’application appropriée des règles de gestion de l’année bissextile et du jour bissextile nécessite le suivi de la conversion appropriée entre les objets date-heure de différents types tels que le struct Windows SYSTEMTIME et le struct C tm . Différents types date/heure peuvent avoir des bases différentes pour les champs année, mois et jour. Par exemple, SYSTEMTIME a une année basée sur 0, mais 1 mois et jours. D’autre part, tm a une année basée sur 1900, un mois basé sur 0 et un champ de jour basé sur 1. Pour convertir un objet d’un de ces types en objet d’un autre type, les champs année, mois et jour doivent être ajustés de manière appropriée.

Nom de l’analyse du code : INCOMPLETE_DATETIME_CONVERSION

Exemple

Le code suivant tente de convertir une instance de tm SYSTEMTIME. Il apporte l’ajustement nécessaire au champ de l’année, mais n’ajuste pas correctement le champ mois :

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

Pour résoudre ce problème, ajustez les champs mois et année :

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

Heuristique

Cette règle reconnaît uniquement le struct Windows SYSTEMTIME et le struct C tm .

Cette règle est une règle d’opt-in, ce qui signifie que l’analyse du code doit utiliser un fichier d’ensemble de règles, et que la règle doit être explicitement incluse dans le fichier d’ensemble de règles et activée pour qu’elle soit appliquée. Pour plus d’informations sur la création d’un ensemble de règles personnalisé pour l’analyse du code, consultez Utiliser des ensembles de règles pour spécifier les C++ règles à exécuter.

Voir aussi

C6393
C6394
C26861
C26863
C26864