1.03.20224 min

Maciej OlanickiRedakcja Bulldogjob

Aktualizacja C w Linuksie – sprawdź, co się zmieni

Jądro Linux było dotąd rozwijane zgodnie ze standardem sprzed 33 lat. W końcu nadszedł czas na zmiany.

Aktualizacja C w Linuksie – sprawdź, co się zmieni

We wrześniu tego roku minie 30 lat od premiery pierwszej wersji jądra Linux. Przez wszystkie te lata kierowany przez Linusa Torvaldsa zespół oraz zewnętrzne organizacje chcące mieć wkład w kod, bez którego trudno sobie wyobrazić funkcjonowanie lwiej części urządzeń na planecie, wykorzystywały język C. Ale czy zastanawialiście się kiedyś jaki język C?


„Nic lepszego niż C nie powstało”

Linus Torvalds słynie ze swojej bezpośredniości oraz pragmatycznego podejścia do innowacji, które trafnie opisują jego słowa: „nic lepszego niż C nie powstało”. Przy czym należy tu uściślić, że mowa była wówczas stricie o językach niskopoziomowych, które można byłoby wykorzystać w toku prac nad takim oprogramowaniem jak Linux. Z drugiej strony Torvalds – swoim zwyczajem – nie szczędził słów krytyki pod adresem młodszych od C języków, twierdząc między innymi, że „Java to straszny język”, zaś skrajnie krytyczne tyrady wygłaszane wobec języka C++ i programistów, którzy go używają przeszły już do historii IT. 

Krótko mówiąc, lata mijają, a C wciąż jest według Torvaldsa najlepszym językiem do programowania systemowego. Nie jest on zresztą w tej opinii odosobniony, wszak całe portfolio najważniejszych konsumenckich produktów Microsoftu także zostało napisane w C i C++. Nie oznacza to jednak, że tak już będzie zawsze. Microsoft śmiało eksperymentuje z przepisywaniem kolejnych niskopoziomowych komponentów Windowsa na Rusta, entuzjazm wobec tego języka wykazuje zresztą także twórca Linuksa. Tymczasem odnośnie najbliższej przyszłości jądra podjął on zgoła inną decyzję


Torvalds aktualizuje C

Nie ma jednego C. Podobnie jak w przypadku innych języków, C jest rozwijane i ma kolejne wersje najczęściej nazywane standardami. Rzecz jasna trudno w przypadku tak ważnego, niskopoziomowego języka oczekiwać równie dynamicznego cyklu wydawniczego co choćby w przypadku Javy, w rezultacie czego najnowsza odsłona C pochodzi z 2017 roku (C17, ISO/IEC 9899:2018). Mimo to zaskakująca może być informacja, że jądro systemowe, które działa na najbardziej zaawansowanych maszynach na świecie napisane jest w języku rodem z roku… 1989!

To nie pomyłka, dotąd Linux był rozwijany zgodnie z zatwierdzonym 1989 roku standardem C89 znanym także jak ANSI C. Ale to się wkrótce zmieni. Po raz pierwszy w trzydziestoletniej historii prac nad Linuksem zdecydowano się bowiem na aktualizację standardu i już wkrótce jądro będzie rozwijane zgodnie ze standardem C11 z roku 2011 (ISO/IEC 9899:2011). Warto się przy tej okazji zastanowić, co się zmieni dla użytkowników systemów operacyjnych bazujących na jądrze Linux czy też programistów, którzy je modyfikują.

Oczywiście zmiana nie będzie odczuwalna dla zwykłych użytkowników. Uspokajamy także moderów jądra i użytkowników, którzy kompilują je samodzielnie – dzięki wstecznej kompatybilności kompilatorów C nie napotkacie żadnych problemów i kod napisany zgodnie z C89 nadal będzie prawidłowo kompilowany. Skoro zatem różnica nie jest znacząca w zakresie funkcjonalności kolejnych standardów, to dlaczego Torvalds zdecydował o oficjalnej aktualizacji standardu?


Bezpieczeństwo ponad wszystko

Decyzja zapadła po odnalezieniu w jądrze błędu, który mógł zostać wykorzystany przez potencjalnych napastników. Wykorzystanie iteratorów, np. list_for_each_entry(), w specyficznych warunkach doprowadzało do wycieku ostatniego rekordu w elemencie head i pozwalało atakującemu na wstrzyknięcie własnych wartości do kodu wykonywanego przez procesor, co zostało sklasyfikowane jako podatność krytyczna. 

Luka szybko została załatana, lecz ujawniła ona inny problem – C89 nie umożliwia deklarowania zmiennych iteratora wewnątrz pętli, trzeba to było zrobić w zasięgu poza nią. To zaś niechybnie kończyło się wyciekiem ostatniego wpisu w elemencie head. Mowa więc o sytuacji, w której ze względu na wykorzystywany standard C utrudnione było załatanie krytycznej luki, którą bez przesady można porównywać z podatnościami w mechanizmach predykcyjnych procesorów, np. Spectre/Meltdown, które w przyszłości najpewniej pogrzebią całą architekturę x86.

Pozostaje odpowiedzieć na jeszcze jedno pytanie – skoro minimalny kompilator Linuksa, GCC, obsługuje już od dłuższego czasu standard C17 (a trwają pracę nad obsługą kolejnego, C2X, którego premiery możemy się spodziewać już 2023 r.), to dlaczego ekipa podejmująca kluczowe decyzje w sprawie rozwoju Linuksa zdecydowała się na przedostatnią wersję standardu, a nie na najnowszą? Wygląda na to, że znów decydowała przekorna i do cna pragmatyczna natura Linusa Torvaldsa.

W pierwszej kolejności zaproponował on bowiem, aby migrować na standard z 1999 roku, gdyż to właśnie w tej wersji umożliwiono definiowanie zmiennej iteratora wewnątrz pętli. Wyszedł on z założenia, że skoro borykamy się z konkretnym problemem, to powinniśmy sięgnąć po pierwszą wersję C, która ten problem rozwiązuje. Arnd Bergmann zauważył jednak, że zmiana standardu na C99 będzie równie angażująca jak migracja na C11 i w ten sposób przekonał Torvaldsa.

Wszystko wskazuje na to, że pierwszą wersją jądra napisaną w C zgodnym ze standardem C11 będzie Linux 5.18. Jego premiery możemy się spodziewać w maju.

<p>Loading...</p>