Aviso C26862
Um objeto
var
de data e hora foi criado a partir de um tipo diferente de objeto de data e hora, mas a conversão foi incompleta:expr
A regra foi adicionada no Visual Studio 2022 17.8.
Comentários
A imposição adequada das regras de tratamento de ano bissexto e dia bissexto requer o acompanhamento da conversão adequada entre objetos de data e hora de diferentes tipos, como o struct Windows SYSTEMTIME
e o struct C tm
. Diferentes tipos de data e hora podem ter bases diferentes para os campos de ano, mês e dia. Por exemplo, SYSTEMTIME
tem um ano baseado em 0, mas campos de mês e dia baseados em 1. Por outro lado, tm
tem um ano baseado em 1900, um mês baseado em 0 e um dia baseado em 1 campos. Para converter um objeto de um desses tipos em um objeto de outro tipo, os campos de 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 tm
em uma instância de SYSTEMTIME
. Ele faz o ajuste necessário no campo do ano, mas não ajusta corretamente o campo do 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
Essa regra reconhece apenas o struct Windows SYSTEMTIME
e o struct 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 ela 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.