Sdílet prostřednictvím


Řešte chyby a upozornění v nebezpečných strukturách kódu

Tento článek se zabývá následujícími chybami kompilátoru:

  • CS0193: Operátor * nebo -> musí být použit u ukazatele dat.
  • CS0196: Ukazatel musí být indexován pouze jednou hodnotou.
  • CS0208: Nelze převzít adresu, získat velikost nebo deklarovat ukazatel na spravovaný typ ('typ')
  • CS0209: Typ lokálního deklarovaného v pevném příkazu musí být typ ukazatele.
  • CS0210: Inicializátor musíte zadat v deklaraci pevného nebo using příkazu.
  • CS0211: Nelze vzít adresu daného výrazu.
  • CS0212: Adresu nefixovaného výrazu můžete převzít pouze uvnitř inicializátoru pevného příkazu.
  • CS0213: Nemůžete použít příkaz fixed k získání adresy již zafixovaného výrazu.
  • CS0214: Ukazatele a vyrovnávací paměti s pevnou velikostí lze použít pouze v nebezpečném kontextu
  • CS0227: Nebezpečný kód se může zobrazit pouze při kompilaci s /nebezpečným
  • CS0233: Identifikátor nemá předdefinovanou velikost, proto lze velikost použít pouze v nebezpečném kontextu.
  • CS0242: Operace, která je dotčená, není definována u ukazatelů void
  • CS0244: Na typech ukazatelů není platné "is' ani 'as'
  • CS0254: Pravá strana přiřazení ve fixním příkazu nesmí být výraz přetypování
  • CS0459: Nelze převzít adresu místní proměnné jen pro čtení
  • CS0821: Implicitně zadané místní hodnoty nelze opravit.
  • CS1641: Pole vyrovnávací paměti s pevnou velikostí musí mít specifikátor velikosti pole za názvem pole.
  • CS1642: Pole vyrovnávací paměti s pevnou velikostí mohou být pouze členy struktur.
  • CS1656: Nelze přiřadit proměnné, protože se jedná o typ proměnné jen pro čtení.
  • CS1663: Typ vyrovnávací paměti s pevnou velikostí musí být jeden z následujících: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float nebo double
  • CS1665: Buffery s pevnou velikostí musí mít délku větší než nula
  • CS1666: Nelze použít vyrovnávací paměti pevné velikosti obsažené v opravených výrazech. Zkuste použít pevný příkaz.
  • CS1708: Vyrovnávací paměti s pevnou velikostí lze přistupovat pouze přes místní hodnoty nebo pole.
  • CS1716: Nepoužívejte atribut 'System.Runtime.CompilerServices.FixedBuffer'. Místo toho použijte modifikátor pevného pole.
  • CS1919: Při vytváření objektu nelze použít nebezpečný typ "název typu".
  • CS4004: Nelze await v nebezpečném kontextu
  • CS8812: Nelze převést &Method skupinu na typ ukazatele mimo funkci.
  • CS9123: Operátor '&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.

Operace ukazatele a dereferencování

  • CS0193: Operátor * nebo -> musí být použit u datového ukazatele
  • CS0196: Ukazatel musí být indexován pouze jednou hodnotou.
  • CS0242: Operace, která je dotčená, není definována u ukazatelů void

Pokud chcete správně používat operace ukazatele, postupujte podle pravidel pro dereferencování, indexování a aritmetické operace. Další informace naleznete v tématu Typy ukazatelů a ukazatele funkce.

  • Použití operátoru * nebo -> pouze u datových ukazatelů (CS0193). Nepoužívejte tyto operátory s neukazatelovými typy ani s ukazateli na funkce. Ukazatele funkcí nelze v jazyce C# dereferencovat, na rozdíl od C/C++.
  • Indexové ukazatele s pouze jednou hodnotou (CS0196). U ukazatelů se nepodporuje vícerozměrné indexování.
  • Vyhněte se operacím, které nejsou definovány u ukazatelů void (CS0242). Například nezvýšujte ukazatel void, protože kompilátor nezná velikost dat, na která odkazují.

Typy ukazatelů a spravované typy

  • CS0208: Nelze převzít adresu, získat velikost nebo deklarovat ukazatel na spravovaný typ ('typ')
  • CS0233: Identifikátor nemá předdefinovanou velikost, proto lze velikost použít pouze v nebezpečném kontextu.

Pokud chcete pracovat s ukazateli a operátorem sizeof správně, použijte nespravované typy a správné kontexty. Další informace naleznete v tématu Nespravované typy a sizeof operátor.

  • Používejte ukazatele pouze u nespravovaných typů (CS0208). Neurčujte adresu, nezjišťujte velikost ani nedeklarujte ukazatele na spravované typy. Spravované typy zahrnují odkazové typy a struktury, které obsahují pole nebo vlastnosti typu odkazu.
  • sizeof Operátor použijte v unsafe kontextu při práci s typy, jejichž velikost není konstanta kompilačního času (CS0233).

Pevné vyrovnávací paměti

  • CS0209: Typ místního deklarovaného v pevném příkazu musí být typ ukazatele.
  • CS0210: Inicializátor musíte zadat v deklaraci pevného nebo using příkazu.
  • CS0211: Nelze vzít adresu daného výrazu.
  • CS0212: Adresu nefixovaného výrazu můžete převzít pouze uvnitř inicializátoru pevného příkazu.
  • CS0213: Pevný výraz nelze použít k zjištění adresy již pevného výrazu.
  • CS0254: Pravá strana přiřazení pevného příkazu nemusí být výraz přetypování
  • CS0459: Nelze převzít adresu místní proměnné jen pro čtení
  • CS0821: Implicitně zadané místní hodnoty nelze opravit.
  • CS1656: Nelze přiřadit proměnné, protože se jedná o typ proměnné jen pro čtení.

K těmto chybám dochází při nesprávném fixed použití příkazu . Příkaz fixed zabraňuje, aby správce paměti přesunul přesunovatelnou proměnnou, a deklaruje ukazatel na danou proměnnou. Další informace naleznete v tématu Nebezpečný kód a ukazatele.

Správné použití fixed příkazu:

  • Deklarujte proměnnou jako typ ukazatele (CS0209).
  • Zadejte inicializátor v fixed deklaraci příkazu (CS0210).
  • Vezměte adresu pouze platných výrazů: pole, místní proměnné a nepřímý ukazatel (CS0211). Nepřebírejte adresu počítaných výrazů, jako součtu dvou proměnných.
  • Používejte operátor "address-of" u nefixovaných výrazů pouze v inicializátoru příkazu fixed (CS0212).
  • Nepoužívejte fixed příkaz u již pevných výrazů (CS0213). Místní proměnné a parametry v unsafe metodě jsou již pevně umístěny na zásobníku.
  • Nepoužívejte výrazy přetypování na pravé straně fixed přiřazení příkazu (CS0254).
  • Neberte adresu místních proměnných určených jen pro čtení (CS0459). Proměnné ve foreach smyčkách, using příkazech a fixed příkazech jsou jen pro čtení.
  • Místo var v příkazech fixed používejte explicitní typy (CS0821).
  • Nepřiřazujte proměnné v kontextech jen pro čtení, jako jsou foreach smyčky, using příkazy nebo fixed příkazy (CS1656).

Nebezpečná omezení kontextu

  • CS0214: Ukazatele a vyrovnávací paměti s pevnou velikostí lze použít pouze v nebezpečném kontextu
  • CS0227: Nebezpečný kód se může zobrazit pouze při kompilaci s /nebezpečným
  • CS0244: Na typech ukazatelů není "is" ani "as" platný.
  • CS1919: Při vytváření objektu nelze použít nebezpečný typ "název typu".
  • CS4004: Nelze použít 'await' v nebezpečném kontextu
  • CS9123: Operátor &by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.

K těmto chybám dochází při použití nebezpečných konstruktorů kódu bez správného nebezpečného kontextu nebo při pokusu o operace, které nejsou povoleny v nebezpečném kódu. Další informace naleznete v tématu Nebezpečný kód a ukazatele a unsafe klíčové slovo.

Správné použití nebezpečného kódu:

  • Označte metody, typy nebo bloky kódu, které používají ukazatele nebo vyrovnávací paměti s pevnou velikostí, pomocí klíčového unsafe slova (CS0214).
  • Povolte v nastavení projektu možnost kompilátoru AllowUnsafeBlocks při použití klíčového slova unsafe (CS0227).
  • Nepoužívejte operátory is ani as s typy ukazatelů (CS0244). Tyto operátory testování typů nejsou platné pro ukazatele.
  • Nepoužívejte new operátor k vytvoření instancí typu ukazatele (CS1919). Chcete-li vytvořit objekty v nespravované paměti, použijte interop k volání nativních metod, které vracejí ukazatele.
  • Udržujte nebezpečný kód odděleně od asynchronního kódu (CS4004). Vytvořte samostatné metody pro nebezpečné operace a volejte je z asynchronních metod.
  • Nepoužívejte operátor address-of (&) u parametrů nebo místních proměnných v asynchronních metodách (CS9123). Po dokončení asynchronní operace nemusí proměnná existovat.

Vyrovnávací paměti s pevnou velikostí

  • CS1641: Pole s pevnou velikostí musí mít specifikátor velikosti pole za názvem pole.
  • CS1642: Pole vyrovnávací paměti s pevnou velikostí mohou být pouze členy struktur.
  • CS1663: Typ bufferu pevné velikosti musí být jeden z následujících: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float nebo double
  • CS1665: Vyrovnávací paměti s pevnou velikostí musí mít délku větší než nula
  • CS1666: Nelze použít vyrovnávací paměti pevné velikosti obsažené v opravených výrazech. Zkuste použít pevný příkaz.
  • CS1708: Vyrovnávací paměti s pevnou velikostí lze přistupovat pouze přes místní hodnoty nebo pole.
  • CS1716: Nepoužívejte atribut System.Runtime.CompilerServices.FixedBuffer. Místo toho použijte modifikátor pevného pole.

K těmto chybám dochází při práci s vyrovnávacími paměťmi s pevnou velikostí. Pevně velikostní buffery jsou pole vložená přímo do struktur a primárně se používají pro případy spolupráce. Další informace naleznete v tématu Vyrovnávací paměti s pevnou velikostí.

Chcete-li deklarovat a používat vyrovnávací paměti s pevnou velikostí správně:

  • Zadejte velikost pole za názvem pole pomocí kladné celočíselné konstanty (CS1641, CS1665).
  • Deklarujte vyrovnávací paměti s pevnou velikostí pouze ve strukturách, ne ve třídách (CS1642). Pokud potřebujete pole ve třídě, použijte běžné pole.
  • Použijte jeden z podporovaných typů prvků: bool, byte, short, int, long, char, sbyte, , ushort, uint, ulongfloatnebo double (CS1663).
  • Před přístupem ke vyrovnávací paměti (CS1666) použijte příkaz na připnutí struktury, která ji obsahuje.
  • Při přístupu k vyrovnávacím pamětím s pevnou velikostí používejte pouze lokální proměnné nebo pole, nikoli zprostředkující výrazy (CS1708).
  • Místo atributu fixedSystem.Runtime.CompilerServices.FixedBuffer (CS1716) použijte modifikátor pole.

Ukazatelé funkcí

  • CS8812: Nelze převést &Method skupinu na typ ukazatele mimo funkci

Pokud chcete získat ukazatel funkce, použijte operátor address-of s explicitním přetypování typu ukazatele funkce. Nepoužívejte operátor adresování & k přiřazení skupin metod k void* nebo jiným typům, které nejsou ukazateli na funkce. Další informace naleznete v tématu Ukazatele funkce.