Upozornění C26862
Objekt
var
data a času byl vytvořen z jiného typu objektu data a času, ale převod nebyl úplný:expr
Toto pravidlo bylo přidáno v sadě Visual Studio 2022 17.8.
Poznámky
Správné vynucování pravidel pro zpracování přestupného roku a přestupného dne vyžaduje sledování správného převodu mezi objekty data a času různých typů, jako je struktura Systému Windows SYSTEMTIME
a struktura jazyka C tm
. Různé typy data a času můžou mít různé základy pro pole roku, měsíce a dne. Například SYSTEMTIME
má rok založený na 0, ale 1 pole měsíce a dne. Na druhé straně tm
má rok založený na 1900, 0 měsíců a pole pro 1 den. Chcete-li převést objekt jednoho z těchto typů na objekt jiného typu, je třeba odpovídajícím způsobem upravit pole roku, měsíce a dne.
Název analýzy kódu: INCOMPLETE_DATETIME_CONVERSION
Příklad
Následující kód se pokusí převést instanci tm
na instanci .SYSTEMTIME
Upraví pole roku, ale neupraví pole měsíce správně:
#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;
}
Pokud chcete tento problém vyřešit, upravte pole měsíce a roku:
#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;
}
Heuristika
Toto pravidlo rozpozná pouze strukturu Systému Windows SYSTEMTIME
a strukturu jazyka C tm
.
Toto pravidlo je pravidlo výslovného souhlasu, což znamená, že analýza kódu by měla používat soubor sady pravidel a pravidlo by mělo být explicitně zahrnuto do souboru sady pravidel a povoleno, aby se použilo. Další informace o vytvoření vlastní sady pravidel pro analýzu kódu naleznete v tématu Použití sad pravidel k určení C++
pravidel ke spuštění.