Sdílet prostřednictvím


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í.

Viz také

C6393
C6394
C26861
C26863
C26864