Partilhar via


Aviso C26862

Um objeto date-time foi criado a partir de um tipo diferente de objeto var date-time, mas a conversão foi incompleta: expr

Essa regra foi adicionada no Visual Studio 2022 17.8.

Comentários

A aplicação adequada de regras de manipulação de ano bissexto e dia bissexto requer o controle da conversão adequada entre objetos de data-hora de diferentes tipos, como a struct do Windows SYSTEMTIME e a struct C tm . Diferentes tipos de data-hora podem ter bases diferentes para os campos ano, mês e dia. Por exemplo, tem um ano baseado em 0, SYSTEMTIME mas campos de mês e dia com base em 1. Por outro lado, tem um ano baseado em 1900, tm um mês baseado em 0 e um campo de dia baseado em 1. Para converter um objeto de um desses tipos em um objeto de outro tipo, os campos ano, mês e dia devem ser ajustados adequadamente.

Nome da análise de código: INCOMPLETE_DATETIME_CONVERSION

Exemplo

O código a seguir tenta converter uma instância de em uma instância de tm SYSTEMTIME. Ele faz o ajuste necessário no campo ano, mas não ajusta corretamente o campo mês:

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

Para corrigir esse problema, ajuste os campos de mês e ano:

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

Heurística

Esta regra só reconhece a struct do Windows SYSTEMTIME e a estrutura C tm .

Essa regra é uma regra de aceitação, o que significa que a análise de código deve usar um arquivo de conjunto de regras, e a regra deve ser explicitamente incluída no arquivo de conjunto de regras e habilitada para que seja aplicada. Para obter mais informações sobre como criar um conjunto de regras personalizado para análise de código, consulte Usar conjuntos de regras para especificar as C++ regras a serem executadas.

Confira também

C6393
C6394
C26861
C26863
C26864