-- Leo's gemini proxy

-- Connecting to it.omarpolo.com:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=it

Un falso senso di sicurezza


Approfondendo landlock, un nuovo set di API disponibili da linux 5.3 per il sandboxing dei processi, mi sono imbattuto in questo pezzo di codice fornito dagli autori di landlock:


#ifndef landlock_create_ruleset
static inline int landlock_create_ruleset(
		const struct landlock_ruleset_attr *const attr,
		const size_t size, const __u32 flags)
{
	return syscall(__NR_landlock_create_ruleset, attr, size, flags);
}
#endif

da samples/landlock/sandboxer.c


(che poi, file con licenza BSD-3 tra i sorgenti di linux? :D)


Tralasciando lo stato in cui ci si trova su linux con le discrepanze tra quello che il kernel fornisce e glibc permette (e quindi dai tutti insieme a reinventarci libc nei nostri programmi) sul momento ho pensato che all’autore dovesse piacere davvero molto ‘const’!


Il punto è che C usa il passaggio per valore per gli argomenti a funzione; essenzialmente significa che ogni volta che viene passato un argomento, esso viene copiato nello stack della nuova funzione. Questo permette alla funzione chiamata di poter modificare il valore localmente senza che il chiamante se ne accorga.


Esempi come il seguente sono spesso citati per spiegare la differenza:


void foo(int i) { i = 5; }

int
main(void)
{
	int i = 7;
	foo(i);
	printf("i vale %d\n", i);
	return 0;
}

(il cui output è “i vale 7”)


Ciò comporta che l’uso di ‘const’ per interi sia fondamentalmente inutile.


(Si potrebbe arguire che ‘const’ è utile per segnalare che una certa variabile non deve essere mutata, ma in un wrapper da una riga di codice è necessario? Inoltre, è davvero utile in linguaggi come C? Personalmente dubito)


In questo senso, secondo me, l’uso di const rischia di dare un “falso senso di sicurezza”. Chi scrive codice del genere, a forza di ripetere ‘const’ prima di ogni argomento e dopo ogni stellina ‘*’ finisce col convincersi che “il codice deve assolutamente essere sicuro!” In fondo, ha usato tante parole per descriverlo!


Lo stesso problema lo rivedo in parte in alcuni linguaggi di programmazione più moderni, dove sembra regnare la verbosità per nessun beneficio apparente. (Mi riferisco principalmente ai soliti noti: Java, C++, rust e anche quel poco che ho visto del nuovo linguaggio di Drew DeVault)


Un’altra pedanteria esagerata è l’uso di ‘const’ all’interno dei puntatori. Ad esempio, execve(2) è definita come:


int execve(const char *path, char *const argv[], char *const envp[]);

e di riflesso anche la funzione main dovrebbe essere più correttamente definita come:


int main(int argc, char *const argv[]);

La differenza tra un ‘const char *argv[]’ e un ‘char *const argv[]’ è che la prima non permette di mutare l’ordine degli elementi, mentre la seconda sì. Sarei curioso di vedere in quanti ambiti è effettivamente utile distinguere tra “un array immutabile di stringhe” e “un array di stringhe immutabile”, ma ho paura della risposta. Dopotutto, getopt(3) in libc modifica argv (ho i brividi a pensarci), quindi probabilmente è diffuso.


$BlogIt: falso-senso-di-sicurezza.gmi,v 1.1 2021/10/20 07:41:39 op Exp $

-- Response ended

-- Page fetched on Tue Apr 23 15:37:12 2024