Sada pravidel Smíšená doporučená pravidla
Pravidla Microsoft smíšené doporučeno zaměřit se na nejběžnějších a kritické problémy v projektech C++ podporující Common Language Runtime, včetně potenciální bezpečnostní díry, dojde k chybě aplikace a jiné důležité chyby logiky a návrhu.Měli byste zahrnout tuto sadu pravidel v jakékoli vlastní sadě pravidel, kterou vytvoříte pro vaše projekty C++, které podporují modul CLR (Common Language Runtime).Tato sada pravidel je určena pro nakonfigurování pomocí edice sady Visual Studio Professional a vyšší.
Pravidlo |
Description |
---|---|
Použití neinicializované paměti |
|
Přesměrování ukazatele Null |
|
Použití nekontrolované hodnoty |
|
Vrácená hodnota ignorována |
|
Nulové ukončení z volání |
|
Chybějící nulové ukončení |
|
Chybné zřetězení |
|
Chybějící argument řetězce ve funkci Format |
|
Chybějící celočíselný argument ve funkci Format |
|
Chybějící argument ukazatel ve funkci Format |
|
Chybějící argument ukazatele na řetězec ve funkci Format |
|
Vrácení neinicializované paměti |
|
Index překračuje maximální vyrovnávací paměť |
|
Index překračuje maximální vyrovnávací paměť zásobníku |
|
Neplatné přetypování HRESULT na BOOL |
|
Neplatné přetypování BOOL na HRESULT |
|
Neplatné přetypování BOOL na HRESULT vložené kompilátorem |
|
Neplatný test HRESULT s přepínačem NOT |
|
Neplatné porovnání HRESULT k hodnotě -1 |
|
Neplatné přiřazení HRESULT na -1 |
|
Neplatné použití HRESULT jako typu Boolean |
|
Nenulová konstanta s logickým NEBO |
|
Logické NEBO s nenulovou konstantou |
|
Nula s logickým A ztrácí vedlejší účinky |
|
Vynucené místní uvolnění |
|
Vytváření Null DACL |
|
Nevydané popisovače adres |
|
Nechráněné použití Alloca |
|
Použití ukončení vlákna |
|
Mrtvý kód v přepínači omezeném bitovou operací OR |
|
Použití bajtové aritmetiky |
|
Nadměrné použití zásobníku |
|
Použití Alloca ve smyčce |
|
Chybějící závorky v přetypování |
|
Přístup přes ukazatel ignorován |
|
Chybějící argument typu float ve funkci Format |
|
Nadbytečný argument ve funkci Format |
|
Argument, který není typu float, ve funkci Format |
|
Argument, který není celočíselný, ve funkci Format |
|
Argument, který není znakem, ve funkci Format |
|
Neplatné přetypování řetězce |
|
Neplatné volání CreateProcess |
|
Neshoda Pole-Nové Skalár-Odstranit |
|
Neshoda Skalár-Nový Pole-Odstranit |
|
Neshoda při přidělení-navrácení paměti |
|
Přednost bitového vztahu |
|
Přiřazení nahrazuje podmínku |
|
Neshoda Primitivní pole-Nové Skalár-Odstranit |
|
Neplatný objektový argument ve funkci Format |
|
Logické NEBO z konstant |
|
Nenulové logické NEBO ztrácí vedlejší účinky |
|
Redundantní test |
|
Vzájemné zahrnutí přes logické A je hodnoty False |
|
Vzájemné vyloučení přes logické NEBO je hodnoty True |
|
Priorita logického NE a bitové operace AND |
|
Priorita logického NE a bitové operace OR |
|
Smyčka počítá nahoru z maxima |
|
Smyčka počítá dolů z minima |
|
Tělo smyčky není nikdy provedeno |
|
Nekonečná smyčka |
|
Smyčka provedena pouze jednou |
|
Výsledek posunutí přetypován na větší velikost |
|
Porovnání bitového pole s typem Boolean |
|
Neplatný argument řetězce znaků ve funkci Format |
|
Neplatný argument řetězec širokých znaků ve funkci Format |
|
Neshodné použití velikosti a počtu |
|
Nesprávné volání funkce s proměnnými argumenty |
|
Nevrácení Realloc |
|
Neplatná konstanta filtru výjimky |
|
Výjimka pokračuje v provádění smyčky |
|
Priorita bitové operace OR |
|
Doplněk negace negace |
|
Výjimka pokračuje v hledání |
|
Ignorovaný pomocí uvozovky |
|
Kopírování řetězce namísto porovnání řetězce |
|
Možná neshoda typu argumentu |
|
Neplatné příznaky VirtualFree |
|
Neplatný parametr VirtualFree |
|
Neplatná velikost VirtualFree |
|
Nevrácení popisovače procesu |
|
Chybějící informace o vypnutí |
|
Přetečení vyrovnávací paměti počtem prvků počtem bajtů |
|
Dělení velikosti ukazatele |
|
Přetečení čtení |
|
Přetečení zápisu |
|
Neplatná hodnota parametru |
|
Neplatná hodnota parametru |
|
Neplatná vlastnost atributu |
|
Kolidující hodnoty vlastností atributů |
|
Odkazy nemohou být Null |
|
Null na neukazatel |
|
MustCheck na Void |
|
Velikost vyrovnávací paměti na neukazatel nebo pole |
|
Neshoda Null na nule přístupné přes ukazatel |
|
Oprávnění k zápisu na konstantě |
|
Vrácení použito ve vstupní podmínce |
|
Ukončení znakem Null na neukazateli |
|
MustCheck musí být Ano nebo Ne |
|
Velikost prvku bez velikosti vyrovnávací paměti |
|
Velikost vyrovnávací paměti překračuje velikost pole |
|
Velikost vyrovnávací na neukazateli |
|
Žádné vlastnosti na atributu |
|
Platná velikost na nečitelné vyrovnávací paměti |
|
Zapisovatelná velikost na nezapisovatelné vyrovnávací paměti |
|
Neplatná anotace: hodnota vlastnosti 'NeedsRelease' musí být Ano nebo Ne. |
|
Neplatný přístup přes ukazatel na velikost řetězce |
|
Neplatný typ velikosti řetězce |
|
Neplatný parametr velikosti řetězce |
|
Neplatné nedostupné umístění velikosti řetězce |
|
Neplatný typ vyrovnávací paměti velikosti řetězce |
|
Neplatná anotace: vlastnost NeedsRelease nesmí být použita pro hodnoty typu void. |
|
Nerozpoznaný styl formátu řetězce |
|
Použití poznámek s atributy na tuto funkci způsobí zneplatnění všech existujících poznámek __declspec |
|
Neplatná specifikace velikosti: výraz nelze analyzovat |
|
Neplatný Deref = nebo Notref =: výraz nelze analyzovat |
|
Hodnota není platnou hodnotou Ano/Ne/Možná |
|
Hodnota není hodnota řetězce |
|
Hodnota není číslo |
|
Neočekávaná chyba výrazu poznámky |
|
Očekávaný počet argumentů pro poznámku neodpovídá skutečnému počtu argumentů pro poznámku |
|
Neočekávaná chyba poznámky pro poznámku |
|
Uložení XML souboru protokolu se nezdařilo |
|
Konflikt časování |
|
Selhání správného použití propojené operace |
|
Volající selhal při udržení zámku |
|
Volající selhal při uvolnění zámku |
|
Volající nemůže držet žádný zámek |
|
Selhání při uvolnění zámku |
|
Selhání při získání nebo udržení zámku |
|
Uvolnění nepotřebného zámku |
|
Chyba souběžné poznámky SAL |
|
Výraz není pravdivý pro toto volání |
|
Parametr popsaný poznámkou musí být ukazatel |
|
Třídy funkcí této funkce neodpovídají třídám funkcí na typu typedef použitém k jejich definici. |
|
Přiřazovaná nebo předávaná funkce by měla mít poznámku _Function_class_ pro nejméně jednu ze tříd |
|
Přiřazovaný ukazatel funkce je popsaný pomocí třídy funkcí, která není obsažena v seznamu tříd funkcí. |
|
Typ skutečného parametru by měl přesně odpovídat typu |
|
Proměnná, která je přístupná prostřednictvím funkce Interlocked, musí být vždy přístupná prostřednictvím funkce Interlocked. |
|
Přistupování k místní proměnné prostřednictvím funkce Interlocked |
|
Funkce musí být volána v rámci bloku try/except |
|
Proměnný argument by měl být (literál) konstantou |
|
Konstantní argument by měl být proměnná |
|
Zvažte raději použití jiné funkce. |
|
Poznámka chyby |
|
Funkce by nikdy neměla být volána v rámci bloku try/except |
|
Argument je předávaný funkci, která očekává ukazatel na objekt (ne ukazatel na ukazatel) |
|
Přistupování přes ukazatel NULL.Ukazatel obsahuje stejnou hodnotu NULL jako jiný ukazatel. |
|
Argument by mohl být jedna hodnota a je kopií hodnoty nalezené v ukazateli |
|
Proměnná drží hodnotu, která musí být zkontrolována |
|
Požadavek není splněn. (Výraz není vyhodnocen na hodnotu True.) |
|
Neplatný odkaz na nestatický člen |
|
Nejednoznačný odkaz na člen třídy. |
|
_Success_ nebo _On_failure_ použito v neplatném kontextu |
|
Zleva struktura operand body, použijte '->" |
|
Levý operand je struktura, použijte '.' |
|
Deklarace pro symbol má kolidující deklaraci |
|
Poznámky pro kontext __on_failure nesmí být v explicitním předkontextu |
|
Pro SAL_context byl očekáván název statického kontextu |
|
Pro poznámku byl očekáván výraz ukazatele |
|
Poznámka _Use_decl_annotations_ musí být použita pro odkazování předchozí deklarace bez úprav. |
|
Názvy parametrů atributu musí být p1...p9 |
|
Typefix nelze použít na parametr, který již má typefix |
|
Poznámka checkReturn platí pouze pro následné podmínky pro určitý parametr funkce. |
|
Počet parametrů poznámky na funkci neodpovídá tomu, který byl nalezen v souboru |
|
Parametr poznámky pro parametr funkce neodpovídá tomu, který byl nalezen v souboru |
|
Člen výčtu byl očekáván pro okomentování parametru v poznámce |
|
Celočíselný výraz byl očekáván pro okomentování parametru v poznámce |
|
Výraz řetězce byl očekáván pro parametr v poznámce |
|
Pro poznámku očekávány hodnoty __yes, __no nebo __maybe |
|
Nebyl nalezen očekávaný Token/identifikátor pro poznámku, parametr |
|
Poznámka vyžaduje parametry |
|
Nebyl nalezen správný počet požadovaných parametrů v poznámce |
|
Poznámka nemůže být také PrimOp (v aktuální deklaraci) |
|
Poznámka nemůže být také PrimOp (viz předchozí deklarace) |
|
Parametr poznámky: v poznámkách nelze používat typ |
|
Poznámka nepodporuje parametry |
|
Typ parametru nemá žádné členy. |
|
Poznámka je platná pouze pro pole |
|
pre, post nebo deref nebyly použity pro ani jednu poznámku |
|
pre, post nebo deref použity pro blok |
|
Výraz __at se nevztahuje na aktuální funkci |
|
Funkce nemůže zůstat sama jako poznámka |
|
Poznámka nemůže být použita ve výrazu |
|
Poznámka pro parametr není již nadále podporována |
|
Poznámka pro parametr má více než jednu value, stringValue nebo longValue.Použijte paramn=xxx |
|
Poznámka pro parametr má jak value, stringValue a longValue, tak i paramn=xxx.Použijte pouze paramn=xxx |
|
Poznámka pro parametr obsahuje param2, ale ne param1 |
|
Poznámka pro funkci na parametru není rozpoznána |
|
Poznámka pro funkci na parametru vyžaduje více přístupů přes ukazatel, než skutečný typ s poznámkou umožňuje |
|
Poznámka pro funkci má neanalyzovatelnou poznámku parameter/external |
|
Poznámka pro funkci popisuje 'this' na funkci bez členu |
|
Poznámka parametru pro funkci neodpovídá typu parametru |
|
Nekonzistentní poznámka pro funkci: v předchozí instanci došlo k chybě. |
|
Nekonzistentní poznámka pro funkci: v této instanci došlo k chybě. |
|
Nekonzistentní poznámka pro funkci: parametr má v této instanci jiné anotace. |
|
Nekonzistentní poznámka pro funkci: parametr má v této instanci jiné anotace. |
|
dynamic_cast<>() nepodporuje poznámky |
|
Ve funkci byla nalezena chyba syntaxe v poznámce |
|
Chyba syntaxe v podmíněné poznámce byla nalezena pro Vnitřní poznámku |
|
Výsledné seznamy hodnot musí být konstanty. |
|
Chyba syntaxe v poznámkách byla nalezena v poznámce pro funkci. |
|
V poznámce pro funkci je parametr nekonzistentní s deklarací funkce při zkoumání |
|
Klíče funkce nejsou konzistentní s deklarací funkce |
|
Parametr _Macro_value_ je null |
|
Pro symbol byl nalezen 'begin' bez odpovídajícího 'end' |
|
Pro symbol byl nalezen 'end' bez odpovídajícího 'begin' |
|
Řetězce formátu musí být ve vstupních podmínkách |
|
Chyba syntaxe v parametru funkce |
|
Chyba syntaxe poblíž konce funkce |
|
Chyba syntaxe v poznámce _At_() pro funkci (název parametru nebyl rozpoznán) |
|
Chyba syntaxe v poznámce _At_() pro funkci (neplatný název parametru) |
|
ReadableTo nebo WritableTo pro funkci nemá parametr limit-spec |
|
Poznámka pro funkci obsahuje více externích typů než skutečný počet parametrů |
|
Zapsání null/notnull je pro deref na úrovní 0 pro funkci bezvýznamné. |
|
Operandy výrazu nejsou kompatibilních typů pro operátor |
|
Žádné poznámky pro první deklaraci funkce. |
|
Na poznámce byl nalezen nadbytečný operátor _Deref_. |
|
V poznámce byl nalezen nejednoznačný operátor _Deref_. |
|
Na token byl nesprávně umístěn operátor _Notref_. |
|
Byla zjištěna chyba při analýze tokenu. |
|
Poznámka na parametr je zastaralá |
|
Poznámka na parametr je zastaralá |
|
Poznámka popisuje situaci, která není podmíněně použitelná. |
|
Poznámka popisuje, kde dynamickou hodnotu (proměnnou) nelze v podmínce použít. |
|
Typy, které vlastní uvolnitelná pole, by měly být uvolnitelné |
|
Deklarujte správně ovladače událostí |
|
Označte sestavení pomocí AssemblyVersionAttribute |
|
Metody rozhraní by měly být volatelné podřízenými typy |
|
Typy, které vlastní nativní prostředky, by měly být uvolnitelné |
|
Přesuňte volání nespravovaných kódů do třídy NativeMethods |
|
Neskrývejte metody základní třídy |
|
Implementuje správně IDisposable |
|
Nevyvolávejte výjimky v neočekávaných umístěních |
|
Vyhněte se duplicitním akcelerátorům |
|
Vstupní body volání nespravovaného kódu by měly existovat |
|
Volání nespravovaných kódů by neměla být viditelná |
|
Typy automatického rozložení by neměly být viditelné modelu COM |
|
Volejte GetLastError ihned po volání nespravovaného kódu |
|
Základní typy viditelného typu modelu COM by měly být viditelné modelu COM |
|
Metody registrace modelu COM by si měly odpovídat |
|
Deklarujte správně volání nespravovaných kódů |
|
Odstraňte prázdné finalizační metody |
|
Pole hodnotového typu by měla být přenosná |
|
Deklarace volání nespravovaného kódu by měla být přenosná |
|
Nepoužívejte zámky na objekty se slabou identitou |
|
Zkontrolujte dotazy SQL pro chyby zabezpečení |
|
Určete zařazování pro argumenty řetězce volání nespravovaného kódu |
|
Zkontrolujte deklarativní zabezpečení na hodnotových typech |
|
Ukazatele by neměly být viditelné |
|
Zabezpečené typy by neměly vystavovat pole |
|
Zabezpečení metody by mělo být nadmnožinou typu |
|
Metody APTCA by měly volat pouze metody APTCA |
|
Typy APTCA by měly rozšiřovat pouze základní typy APTCA |
|
Nezveřejňujte nepřímo metody s požadavky propojení |
|
Požadavky odkazu přepisu by měly být shodné se základem |
|
Zabalte ohrožené klauzule finally do vnějšího bloku try |
|
Požadavky propojení typů vyžadují požadavky dědičnosti |
|
Důležité typy zabezpečení se nemusí účastnit rovnocennosti typu |
|
Výchozí konstruktory musí být alespoň tak kritické jako výchozí konstruktory základního typu |
|
Delegáti musí navázat na metody s konzistentní transparentností |
|
Metody musí při přepisu základních metod zachovat konzistentní transparentnost |
|
Transparentní metody musí obsahovat pouze ověřitelné IL |
|
Transparentní metody nesmí volat metody s atributem SuppressUnmanagedCodeSecurity |
|
Transparentní kód nesmí odkazovat na důležité položky zabezpečení |
|
Transparentní metody nesmí splňovat LinkDemands |
|
Typy musí být alespoň tak kritické jako jejich rozhraní a základní typy |
|
Transparentní metody nemohou používat bezpečnostní vyhodnocení |
|
Transparentní metody nesmí volat do nativního kódu |
|
Znovu vyvolejte výjimku pro zachování podrobností zásobníku |
|
Neuvolňujte objekty několikrát |
|
Statická pole hodnotového typu inicializujte vloženým kódem |
|
Neoznačujte obsluhované komponenty pomocí WebMethod |
|
Uvolnitelná pole by měla být uvolněna |
|
Nevolejte přepisovatelné metody v konstruktorech |
|
Uvolnitelné typy by měly deklarovat finalizační metodu |
|
Finalizační metody by měly volat finalizační metodu základní třídy |
|
Implementujte konstruktory serializace |
|
Je třeba přetížit operátor rovnosti při přetížení ValueType.Equals |
|
Označte vstupní body modelu Windows Forms pomocí STAThread |
|
Označte všechna neserializovatelná pole |
|
Volejte metody základní třídy na typech ISerializable |
|
Označte typy ISerializable pomocí SerializableAttribute |
|
Implementujte správně metody serializace |
|
Implementujte správně rozhraní ISerializable |
|
Poskytněte správné argumenty metodám formátování |
|
Testujte správně hodnotu NaN |