Po pierwsze, jak wspominali inni, C / C ++ jest czasami określany jako gloryfikowany asembler makr: ma być „bliski żelazka”, jako język programowania na poziomie systemu.
Na przykład język pozwala mi zadeklarować tablicę o zerowej długości jako symbol zastępczy, podczas gdy w rzeczywistości może ona reprezentować sekcję o zmiennej długości w pakiecie danych lub początek regionu o zmiennej długości w pamięci, który jest używany do komunikować się z częścią sprzętu.
Niestety oznacza to również, że C / C ++ jest niebezpieczny w niepowołanych rękach; jeśli programista zadeklaruje tablicę 10 elementów, a następnie zapisze do elementu 101, kompilator z radością ją skompiluje, kod szczęśliwie wykona, usuwając wszystko, co znajduje się w tej lokalizacji pamięci (kod, dane, stos, kto wie). / p>
Po drugie, C / C ++ jest idiosynkratyczne. Dobrym przykładem są łańcuchy, które są w zasadzie tablicami znaków. Ale każda stała łańcuchowa ma dodatkowy, niewidoczny znak kończący. Stało się to przyczyną niezliczonych błędów, ponieważ (zwłaszcza, ale nie wyłącznie) początkujący programiści często nie przydzielają dodatkowego bajtu potrzebnego do kończenia wartości null.
Po trzecie, C / C ++ jest właściwie dość stary. Język powstał w czasie, gdy zewnętrzne ataki na system oprogramowania w zasadzie nie istniały. Od użytkowników oczekiwano zaufania i współpracy, a nie wrogości, ponieważ ich celem było sprawienie, aby program działał, a nie jego awaria.
Z tego powodu standardowa biblioteka C / C ++ zawiera wiele funkcji, które są z natury niebezpieczne. Weźmy na przykład strcpy (). Z przyjemnością skopiuje wszystko, aż do kończącego znaku null. Jeśli nie znajdzie kończącego znaku null, będzie kopiował dalej, aż piekło zamarznie, lub bardziej prawdopodobne, dopóki nie nadpisze czegoś ważnego i program się zawiesi. Nie stanowiło to problemu w starych dobrych czasach, kiedy od użytkownika nie oczekiwano, że wejdzie w pole zarezerwowane dla, powiedzmy, kodu pocztowego, 16000 śmieci, po których następuje specjalnie skonstruowany zestaw bajtów, które miały zostać wykonane po usunięciu stosu i wznowieniu wykonywania przez procesor pod niewłaściwym adresem.
Dla pewności, C / C ++ nie jest jedynym językiem idiosynkratycznym. Inne systemy mają inne idiosynkratyczne zachowanie, ale może być równie złe. Weźmy języki programowania zaplecza, takie jak PHP, i to, jak łatwo jest napisać kod, który pozwala na wstrzykiwanie SQL.
Ostatecznie, jeśli damy programistom potężne narzędzia, których potrzebują do wykonywania swojej pracy odpowiednie szkolenie i świadomość środowiska bezpieczeństwa, złe rzeczy zdarzają się bez względu na używany język programowania.