Názor ke článku Bezpečné programování v C++ I od Lael Ophir - [54] C# ani Java nemají konstrukci typu pointer, to...

  • 3. 4. 2009 16:46

    Lael Ophir (neregistrovaný)

    [54]
    C# ani Java nemají konstrukci typu pointer, to je prostý fakt. Že kompilátorem vygenerovaný kód pointery interně používá (protože jde nakonec o strojový kód), to je v kontextu naprosto nepodstatné. Rozdíl je v tom, jestli vám jazyk dovolí jako pointer předat kdejaký nesmysl, nebo jestli vyžaduje zapouzdření typu .NET delegate, které chyby programátora při manipulaci s pointery vylučuje. Ve vhodně nastaveném prostředí tak můžete vyloučit nejběžnější chyby, podobně jako jsme úpravami automobilů zabránili těm volantům často zakousnutým do břicha.

    Samozřejmě můžete vymyslet konstrukce, které zvyšují bezpečnost kódu psaného v C/C++. Bohužel je to ale marná snaha, protože nemůžete VYNUTIT jejich používání. Když použijete smart pointers, přesto stačí jediné nesprávné použití klasického pointeru, nebo jediné nesprávné použití strcpy, a iluze bezpečnosti je v háji. A tomu aby autor kódu použil nebezpečnou konstrukci namísto bezpečné v C/C++ prostě nezabráníte.

    Ohledně bezpečnosti, spolehlivosti a C# si nijak neprotiřečím. To jen vy stavíte na chybných předpokladech. Veliké procento kódu pro Windows je napsané v C++, včetně samotných Windows. Pokud uvedete další aplikaci v C#, počet chyb v C++ aplikacích (a v systému psaném v C/C++) tím nijak nesnížíte.

    Nemá smysl objevně konstatovat, že buffer overflow je chyba programátora. Za chybu v kódu může programátor. Ovšem také víme, že ze své podstaty chybu nakonec vždy udělá, a že bude chybovat poměrně často. Můžeme buď alibisticky říkat "ale za to může programátor" a nic s tím nedělat, nebo mu dát takové nástroje, které buffer overflow vyloučí. Vy jste pro tu první možnost, já pro druhou. První možnost byla zkoušena desítky let, a problém zjevně neřeší. Druhá možnost problém prokazatelně řeší.

    V C++ jste samozřejmě také vždy omezen strojem. V ASM jste omezen méně, a v čistém strojáku nejméně. Otázkou je, jestli chceme co nejvíce možností, nebo funkční a spolehlivý SW. Jako zástupce zákazníků říkám, že možnosti pro autory kódu musí ustoupit funkčnosti a bezpečnosti. Ustoupili jsme jednou, když průmysl přešel od ASM v C/C++. A ustoupíme znovu, a bude to dobré pro IT.

    Je úplně jedno, jestli se bavíme o Linuxu nebo o Windows. Nespolehlivé a nebezpečné aplikace jsou dnes na všech platformách. A jestli myslíte, že aplikace je spolehlivá a bezpečná, když v ní budete opakovat svých pár naučených kroků, tak se šeredně mýlíte. No a ohledně bezpečnosti je to katastrofa už dlouhá léta. Webové browsery, které zpracovávají hloupých pár set tagů, jsou zjevně děravé jako řešeto. Emailoví klienti, kompresní a dekompresní utility, kodeky, knihovny pro imaging atd. - chyby jsou všude kolem. Jestli je nevidíte, máte klapky na očích.

    Já vám pravdu nevnucuji. Klidně piště dál v C/C++, a věřte tomu, že se uhlídáte, a žádnou chybu neuděláte. Jenom vám musí přijít divné, kde pořád vznikají ty chyby včetně buffer overflow v OS, frameworcích, DB enginech, desktopových aplikacích atd. Všichni ti profíci se přeci měli dávno poučit, stejně jako se měli poučit řidiči ;).
    Když někdo propaguje opatření ke zlepšení situace, které zjevně řeší některé chyby (včetně buffer overflow), umožňuje do budoucna dát záruky na kvalitu kódu, a jaksi mimochodem také zvyšuje produktivitu práce programátora, tak mu prostě řekněte, že je za tím jeho zaslepenost nebo finanční zájmy. Musíte nějak ukázat, že si nevidíte dál, než na špičku vlastního nosu.