Co jest nie tak z C?

1

Czytam o nowym bugu w kernelu: https://blog.qualys.com/vulnerabilities-threat-research/2021/07/20/sequoia-a-local-privilege-escalation-vulnerability-in-linuxs-filesystem-layer-cve-2021-33909
W skrócie: size_t przekazali do funkcji akceptującej int i jest root. W Rust tak się nie da bez jawnej konwersji, tymczasem w C:

lw@linux-mint-desktop /tmp> cat a.c
#include <stddef.h>
#include <stdio.h>

void call(int s) {
	printf("doin' something with s.... %d\n", s);	
}

int main() {
	size_t s = 10;
	call(s);
	return 0;
}


lw@linux-mint-desktop /tmp> gcc a.c -o a -Wall -pedantic
lw@linux-mint-desktop /tmp> valgrind ./a
==13764== Memcheck, a memory error detector
==13764== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==13764== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==13764== Command: ./a
==13764== 
doin' something with s.... 10
==13764== 
==13764== HEAP SUMMARY:
==13764==     in use at exit: 0 bytes in 0 blocks
==13764==   total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==13764== 
==13764== All heap blocks were freed -- no leaks are possible
==13764== 
==13764== For lists of detected and suppressed errors, rerun with: -s
==13764== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Żadnego błędu, ostrzeżenia, niciego. "Bundziesz pon zadowolony". Why?

6

Wiesz kiedy powstało C? Dawno to było. Nie oczekuj od tak starego języka, że będzie spełniał wymogi współczesnego programowania. :D Nie oczekuj, też że nowoczesność wejdzie pod strzechy od razu, bo to trwa, zwłaszcza jeśli chodzi o OSy, bo przepisanie systemu na nowoczesny język to wiele pracy, może się okazać, że większy niż naprawianie bugów, które będą tam i tak. :)

4

Zgadzam się z @elwis acz z votum separatum

Dodam, w czasach w jakich C powstawał (1969-70-75-80) , były bardziej ambitne języki, bezpieczniejsze itd, więc to nie tak, ze nie było się do czego odnieść itd
Algol ma rozwój od ok 1960, i znacząca ilość innych języków. Rynek, naukowcy w pełni rozważali zagadnienia, które zaskutkowały językiem Ada, Modula. To nie tak, że pewne pytania, zagadnienia nie zostały postawione.

Więc C powstał prymitywny nie ze względu na lata (w jakimś tylko stopniu), ale bo takie były założenia
Chodziło o "lepszy assembler", czyli taki sam brak kontroli buforów, szybka ścieżka do portowania na nowe maszyny, boostrapujący się kompilator itd.

UPD: oddzielna historia, czy / dlaczego / na ile C zakonserwował rynek, twórczość w swoim zakresie (języków systemowych) na lat przynajmniej 50. Niestety

UPD2 np dziś NIKT przy zdrowych zmysłach nie uznaje zalet niejawnej automatycznej konwersji wszystkiego do sensu wyrażenia logicznego, tylko w pierwszych miesiachc, góra 2-3 latach C optymalizatory generowały by z "porządnych wyrażeń" jeden rozkaz za dużo JNZ / JZ. Ale ze względu na miliardy linii kodu nie da się tego zmienić, i mamy if(a=b)

2

W kodzie powyżej nie ma prawa być "roota" bo wartość 10 nie przekręca inta na żadnej dającej się używać platformie.

Ale.
C (i C++) jest zwalone nie dlatego że jest stare, ale przez upór komisyj standaryzacyjnych które nie chcą języka naprawić usuwając pułapki w postaci UB na prawo i lewo (w tym przypadku signed overflow).

1

@AnyKtokolwiek: Pewnie, tylko bezpieczeństwo to nie jedyne wymaganie współczesnego programowania. :) Oczywiście, że były bezpieczniejsze, elastyczniejsze i bardziej ekspresywne języki, ale raczej nie spełniają współczesnych potrzeb bardziej niż C, bo wciąż są rozwijane nowe języki. :)

0
elwis napisał(a):

@AnyKtokolwiek: Pewnie, tylko bezpieczeństwo to nie jedyne wymaganie współczesnego programowania. :) Oczywiście, że były bezpieczniejsze, elastyczniejsze i bardziej ekspresywne języki, ale raczej nie spełniają współczesnych potrzeb bardziej niż C, bo wciąż są rozwijane nowe języki. :)

Ja już nie w pełni wierzę w rozwijanie "pod spełnianie potrzeb", czasem to powody ambicjonalne, marketingowe, prawne (C# który urodził się jako J#, tylko prawnicy kazali zmienić) krwawe pożegnania w konfliktach, czy CIEKAWOŚĆ (sam zaimplementowałem kilka mini języków - to jest jedna z ciekawszych, twórczych rzeczy, jakie może zrobic programista, albo tak mu się wydaje)

2
AnyKtokolwiek napisał(a):

Ja już nie w pełni wierzę w rozwijanie "pod spełnianie potrzeb", czasem to powody ambicjonalne, marketingowe, prawne (C# który urodził się jako J#, tylko prawnicy kazali zmienić) krwawe pożegnania w konfliktach, czy CIEKAWOŚĆ (sam zaimplementowałem kilka mini języków - to jest jedna z ciekawszych, twórczych rzeczy, jakie może zrobic programista)

Dlaczego powody ambicjonalne, marketingowe, a już w szczególności ciekawość nie miałyby być objektywnymi potrzebami współczesnego programowania? Myślę, że warto to rozważyć, bo zasadniczo czemu nie? Może ma to większy sens niż mogłoby się zdawać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1