1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun:Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` 4*4882a593Smuzhiyun:Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun.. _it_development_coding: 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunScrivere codice corretto 9*4882a593Smuzhiyun======================== 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunNonostante ci sia molto da dire sul processo di creazione, sulla sua solidità 12*4882a593Smuzhiyune sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo 13*4882a593Smuzhiyundel kernel si trova nel codice stesso. È il codice che sarà esaminato dagli 14*4882a593Smuzhiyunaltri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la 15*4882a593Smuzhiyunqualità di questo codice che determinerà il successo finale del progetto. 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunQuesta sezione esaminerà il processo di codifica. Inizieremo con uno sguardo 18*4882a593Smuzhiyunsulle diverse casistiche nelle quali gli sviluppatori kernel possono 19*4882a593Smuzhiyunsbagliare. Poi, l'attenzione si sposterà verso "il fare le cose 20*4882a593Smuzhiyuncorrettamente" e sugli strumenti che possono essere utili in questa missione. 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunTrappole 23*4882a593Smuzhiyun-------- 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunLo stile del codice 26*4882a593Smuzhiyun******************* 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in 29*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`. 30*4882a593SmuzhiyunPer la maggior parte del tempo, la politica descritta in quel file è stata 31*4882a593Smuzhiyunpraticamente informativa. Ne risulta che ci sia una quantità sostanziale di 32*4882a593Smuzhiyuncodice nel kernel che non rispetta le linee guida relative allo stile. 33*4882a593SmuzhiyunLa presenza di quel codice conduce a due distinti pericoli per gli 34*4882a593Smuzhiyunsviluppatori kernel. 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunIl primo di questi è credere che gli standard di codifica del kernel 37*4882a593Smuzhiyunnon sono importanti e possono non essere applicati. La verità è che 38*4882a593Smuzhiyunaggiungere nuovo codice al kernel è davvero difficile se questo non 39*4882a593Smuzhiyunrispetta le norme; molti sviluppatori richiederanno che il codice sia 40*4882a593Smuzhiyunriformulato prima che anche solo lo revisionino. Una base di codice larga 41*4882a593Smuzhiyunquanto il kernel richiede una certa uniformità, in modo da rendere possibile 42*4882a593Smuzhiyunper gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono, 43*4882a593Smuzhiyunquindi, più spazi per un codice formattato alla carlona. 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunOccasionalmente, lo stile di codifica del kernel andrà in conflitto con lo 46*4882a593Smuzhiyunstile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel 47*4882a593Smuzhiyundovrà prevalere prima che il codice venga inserito. Mettere il codice 48*4882a593Smuzhiyunall'interno del kernel significa rinunciare a un certo grado di controllo 49*4882a593Smuzhiyunin differenti modi - incluso il controllo sul come formattare il codice. 50*4882a593Smuzhiyun 51*4882a593SmuzhiyunL’altra trappola è quella di pensare che il codice già presente nel kernel 52*4882a593Smuzhiyunabbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero 53*4882a593Smuzhiyuniniziare a generare patch che correggono lo stile come modo per prendere 54*4882a593Smuzhiyunfamigliarità con il processo, o come modo per inserire i propri nomi nei 55*4882a593Smuzhiyunchangelog del kernel – o entrambe. La comunità di sviluppo vede un attività 56*4882a593Smuzhiyundi codifica puramente correttiva come "rumore"; queste attività riceveranno 57*4882a593Smuzhiyununa fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch. 58*4882a593SmuzhiyunMentre si lavora su un pezzo di codice è normale correggerne anche lo stile, 59*4882a593Smuzhiyunma le modifiche di stile non dovrebbero essere fatte fini a se stesse. 60*4882a593Smuzhiyun 61*4882a593SmuzhiyunIl documento sullo stile del codice non dovrebbe essere letto come una legge 62*4882a593Smuzhiyunassoluta che non può mai essere trasgredita. Se c’è un a buona ragione 63*4882a593Smuzhiyun(per esempio, una linea che diviene poco leggibile se divisa per rientrare 64*4882a593Smuzhiyunnel limite di 80 colonne), fatelo e basta. 65*4882a593Smuzhiyun 66*4882a593SmuzhiyunNotate che potete utilizzare lo strumento “clang-format” per aiutarvi con 67*4882a593Smuzhiyunle regole, per una riformattazione automatica e veloce del vostro codice 68*4882a593Smuzhiyune per revisionare interi file per individuare errori nello stile di codifica, 69*4882a593Smuzhiyunrefusi e possibili miglioramenti. Inoltre è utile anche per classificare gli 70*4882a593Smuzhiyun``#includes``, per allineare variabili/macro, per testi derivati ed altri 71*4882a593Smuzhiyuncompiti del genere. Consultate il file 72*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>` 73*4882a593Smuzhiyunper maggiori dettagli 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun 76*4882a593SmuzhiyunLivelli di astrazione 77*4882a593Smuzhiyun********************* 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun 80*4882a593SmuzhiyunI professori di Informatica insegnano ai propri studenti a fare ampio uso dei 81*4882a593Smuzhiyunlivelli di astrazione nel nome della flessibilità e del nascondere informazioni. 82*4882a593SmuzhiyunCerto il kernel fa un grande uso dell'astrazione; nessun progetto con milioni 83*4882a593Smuzhiyundi righe di codice potrebbe fare altrimenti e sopravvivere. Ma l'esperienza 84*4882a593Smuzhiyunha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa 85*4882a593Smuzhiyunal pari di una prematura ottimizzazione. L'astrazione dovrebbe essere usata 86*4882a593Smuzhiyunfino al livello necessario e non oltre. 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunAd un livello base, considerate una funzione che ha un argomento che viene 89*4882a593Smuzhiyunsempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere 90*4882a593Smuzhiyunquell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità 91*4882a593Smuzhiyunofferta. In ogni caso, tuttavia, ci sono buone possibilità che il codice 92*4882a593Smuzhiyunche va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera 93*4882a593Smuzhiyunsottile, in un modo che non è mai stato notato - perché non è mai stato usato. 94*4882a593SmuzhiyunOppure, quando sorge la necessità di avere più flessibilità, questo argomento 95*4882a593Smuzhiyunnon la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel, 96*4882a593Smuzhiyunsottopongono costantemente patch che vanno a rimuovere gli argomenti 97*4882a593Smuzhiyuninutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti. 98*4882a593Smuzhiyun 99*4882a593SmuzhiyunI livelli di astrazione che nascondono l'accesso all'hardware - 100*4882a593Smuzhiyunspesso per poter usare dei driver su diversi sistemi operativi - vengono 101*4882a593Smuzhiyunparticolarmente disapprovati. Tali livelli oscurano il codice e possono 102*4882a593Smuzhiyunpeggiorare le prestazioni; essi non appartengono al kernel Linux. 103*4882a593Smuzhiyun 104*4882a593SmuzhiyunD'altro canto, se vi ritrovate a dover copiare una quantità significativa di 105*4882a593Smuzhiyuncodice proveniente da un altro sottosistema del kernel, è tempo di chiedersi 106*4882a593Smuzhiyunse, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo 107*4882a593Smuzhiyunin una libreria separata o di implementare quella funzionalità ad un livello 108*4882a593Smuzhiyunpiù elevato. Non c'è utilità nel replicare lo stesso codice per tutto 109*4882a593Smuzhiyunil kernel. 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun#ifdef e l'uso del preprocessore in generale 113*4882a593Smuzhiyun******************************************** 114*4882a593Smuzhiyun 115*4882a593SmuzhiyunIl preprocessore C sembra essere una fonte di attrazione per qualche 116*4882a593Smuzhiyunprogrammatore C, che ci vede una via per ottenere una grande flessibilità 117*4882a593Smuzhiyunall'interno di un file sorgente. Ma il preprocessore non è scritto in C, 118*4882a593Smuzhiyune un suo massiccio impiego conduce a un codice che è molto più difficile 119*4882a593Smuzhiyunda leggere per gli altri e che rende più difficile il lavoro di verifica del 120*4882a593Smuzhiyuncompilatore. L'uso eccessivo del preprocessore è praticamente sempre il segno 121*4882a593Smuzhiyundi un codice che necessita di un certo lavoro di pulizia. 122*4882a593Smuzhiyun 123*4882a593SmuzhiyunLa compilazione condizionata con #ifdef è, in effetti, un potente strumento, 124*4882a593Smuzhiyuned esso viene usato all'interno del kernel. Ma esiste un piccolo desiderio: 125*4882a593Smuzhiyunquello di vedere il codice coperto solo da una leggera spolverata di 126*4882a593Smuzhiyunblocchi #ifdef. Come regola generale, quando possibile, l'uso di #ifdef 127*4882a593Smuzhiyundovrebbe essere confinato nei file d'intestazione. Il codice compilato 128*4882a593Smuzhiyuncondizionatamente può essere confinato a funzioni tali che, nel caso in cui 129*4882a593Smuzhiyunil codice non deve essere presente, diventano vuote. Il compilatore poi 130*4882a593Smuzhiyunottimizzerà la chiamata alla funzione vuota rimuovendola. Il risultato è 131*4882a593Smuzhiyunun codice molto più pulito, più facile da seguire. 132*4882a593Smuzhiyun 133*4882a593SmuzhiyunLe macro del preprocessore C presentano una serie di pericoli, inclusi 134*4882a593Smuzhiyunvalutazioni multiple di espressioni che hanno effetti collaterali e non 135*4882a593Smuzhiyungarantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire 136*4882a593Smuzhiyununa macro, considerate l'idea di creare invece una funzione inline. Il codice 137*4882a593Smuzhiyunche ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili, 138*4882a593Smuzhiyunnon considerano i propri argomenti più volte, e permettono al compilatore di 139*4882a593Smuzhiyuneffettuare controlli sul tipo degli argomenti e del valore di ritorno. 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun 142*4882a593SmuzhiyunFunzioni inline 143*4882a593Smuzhiyun*************** 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunComunque, anche le funzioni inline hanno i loro pericoli. I programmatori 146*4882a593Smuzhiyunpotrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione 147*4882a593Smuzhiyundi una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le 148*4882a593Smuzhiyunprestazioni. Dato che il loro codice viene replicato ovunque vi sia una 149*4882a593Smuzhiyunchiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato. 150*4882a593SmuzhiyunQuesti, a turno, creano pressione sulla memoria cache del processore, e questo 151*4882a593Smuzhiyunpuò causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero 152*4882a593Smuzhiyunessere piccole e usate raramente. Il costo di una chiamata a funzione, dopo 153*4882a593Smuzhiyuntutto, non è così alto; la creazione di molte funzioni inline è il classico 154*4882a593Smuzhiyunesempio di un'ottimizzazione prematura. 155*4882a593Smuzhiyun 156*4882a593SmuzhiyunIn generale, i programmatori del kernel ignorano gli effetti della cache a 157*4882a593Smuzhiyunloro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato 158*4882a593Smuzhiyunall'inizio delle lezioni sulle strutture dati spesso non si applica 159*4882a593Smuzhiyunall'hardware moderno. Lo spazio *è* tempo, in questo senso un programma 160*4882a593Smuzhiyunpiù grande sarà più lento rispetto ad uno più compatto. 161*4882a593Smuzhiyun 162*4882a593SmuzhiyunI compilatori più recenti hanno preso un ruolo attivo nel decidere se 163*4882a593Smuzhiyununa data funzione deve essere resa inline oppure no. Quindi l'uso 164*4882a593Smuzhiyunindiscriminato della parola chiave "inline" potrebbe non essere non solo 165*4882a593Smuzhiyuneccessivo, ma anche irrilevante. 166*4882a593Smuzhiyun 167*4882a593SmuzhiyunSincronizzazione 168*4882a593Smuzhiyun**************** 169*4882a593Smuzhiyun 170*4882a593SmuzhiyunNel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna 171*4882a593Smuzhiyunsotto la licenza GPL e reso disponibile per la sua inclusione nella ramo 172*4882a593Smuzhiyunprincipale del kernel. Questa donazione fu una notizia bene accolta; 173*4882a593Smuzhiyunil supporto per le reti senza fili era considerata, nel migliore dei casi, 174*4882a593Smuzhiyunal di sotto degli standard; il sistema Deviscape offrì la promessa di una 175*4882a593Smuzhiyunrisoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel 176*4882a593Smuzhiyunramo principale fino al giugno del 2007 (2.6.22). Cosa accadde? 177*4882a593Smuzhiyun 178*4882a593SmuzhiyunQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto 179*4882a593Smuzhiyuna porte chiuse. Ma in particolare, un grosso problema fu che non fu 180*4882a593Smuzhiyunprogettato per girare in un sistema multiprocessore. Prima che questo 181*4882a593Smuzhiyunsistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario 182*4882a593Smuzhiyunun lavoro sugli schemi di sincronizzazione. 183*4882a593Smuzhiyun 184*4882a593SmuzhiyunUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare 185*4882a593Smuzhiyunai problemi di concorrenza presenti nei sistemi multiprocessore. Ora, 186*4882a593Smuzhiyuncomunque, questo documento è stato scritto su di un portatile dual-core. 187*4882a593SmuzhiyunPersino su sistemi a singolo processore, il lavoro svolto per incrementare 188*4882a593Smuzhiyunla capacità di risposta aumenterà il livello di concorrenza interno al kernel. 189*4882a593SmuzhiyunI giorni nei quali il codice poteva essere scritto senza pensare alla 190*4882a593Smuzhiyunsincronizzazione sono da passati tempo. 191*4882a593Smuzhiyun 192*4882a593SmuzhiyunOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe 193*4882a593Smuzhiyunavere accesso simultaneo da più di un thread deve essere sincronizzato. Il 194*4882a593Smuzhiyunnuovo codice dovrebbe essere scritto avendo tale accortezza in testa; 195*4882a593Smuzhiyunriadattare la sincronizzazione a posteriori è un compito molto più difficile. 196*4882a593SmuzhiyunGli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene 197*4882a593Smuzhiyunle primitive di sincronizzazione, in modo da sceglier lo strumento corretto 198*4882a593Smuzhiyunper eseguire un compito. Il codice che presenta una mancanza di attenzione 199*4882a593Smuzhiyunalla concorrenza avrà un percorso difficile all'interno del ramo principale. 200*4882a593Smuzhiyun 201*4882a593SmuzhiyunRegressioni 202*4882a593Smuzhiyun*********** 203*4882a593Smuzhiyun 204*4882a593SmuzhiyunVale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante 205*4882a593Smuzhiyunl'idea di eseguire un cambiamento (che potrebbe portare a grandi 206*4882a593Smuzhiyunmiglioramenti) che porterà ad alcune rotture per gli utenti esistenti. 207*4882a593SmuzhiyunQuesta tipologia di cambiamento è chiamata "regressione", e le regressioni son 208*4882a593Smuzhiyundiventate mal viste nel ramo principale del kernel. Con alcune eccezioni, 209*4882a593Smuzhiyuni cambiamenti che causano regressioni saranno fermati se quest'ultime non 210*4882a593Smuzhiyunpotranno essere corrette in tempo utile. È molto meglio quindi evitare 211*4882a593Smuzhiyunla regressione fin dall'inizio. 212*4882a593Smuzhiyun 213*4882a593SmuzhiyunSpesso si è argomentato che una regressione può essere giustificata se essa 214*4882a593Smuzhiyunporta risolve più problemi di quanti non ne crei. Perché, dunque, non fare 215*4882a593Smuzhiyunun cambiamento se questo porta a nuove funzionalità a dieci sistemi per 216*4882a593Smuzhiyunognuno dei quali esso determina una rottura? La migliore risposta a questa 217*4882a593Smuzhiyundomanda ci è stata fornita da Linus nel luglio 2007: 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun:: 220*4882a593Smuzhiyun Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella 221*4882a593Smuzhiyun via nasconde insidie, e nessuno può sapere del tutto se state facendo 222*4882a593Smuzhiyun dei progressi reali. Sono due passi avanti e uno indietro, oppure 223*4882a593Smuzhiyun un passo avanti e due indietro? 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun(http://lwn.net/Articles/243460/). 226*4882a593Smuzhiyun 227*4882a593SmuzhiyunUna particolare tipologia di regressione mal vista consiste in una qualsiasi 228*4882a593Smuzhiyunsorta di modifica all'ABI dello spazio utente. Una volta che un'interfaccia 229*4882a593Smuzhiyunviene esportata verso lo spazio utente, dev'essere supportata all'infinito. 230*4882a593SmuzhiyunQuesto fatto rende la creazione di interfacce per lo spazio utente 231*4882a593Smuzhiyunparticolarmente complicato: dato che non possono venir cambiate introducendo 232*4882a593Smuzhiyunincompatibilità, esse devono essere fatte bene al primo colpo. Per questa 233*4882a593Smuzhiyunragione sono sempre richieste: ampie riflessioni, documentazione chiara e 234*4882a593Smuzhiyunampie revisioni dell'interfaccia verso lo spazio utente. 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun 237*4882a593SmuzhiyunStrumenti di verifica del codice 238*4882a593Smuzhiyun-------------------------------- 239*4882a593SmuzhiyunAlmeno per ora la scrittura di codice priva di errori resta un ideale 240*4882a593Smuzhiyunirraggiungibile ai più. Quello che speriamo di poter fare, tuttavia, è 241*4882a593Smuzhiyuntrovare e correggere molti di questi errori prima che il codice entri nel 242*4882a593Smuzhiyunramo principale del kernel. A tal scopo gli sviluppatori del kernel devono 243*4882a593Smuzhiyunmettere insieme una schiera impressionante di strumenti che possano 244*4882a593Smuzhiyunlocalizzare automaticamente un'ampia varietà di problemi. Qualsiasi problema 245*4882a593Smuzhiyuntrovato dal computer è un problema che non affliggerà l'utente in seguito, 246*4882a593Smuzhiyunne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque 247*4882a593Smuzhiyunpossibile. 248*4882a593Smuzhiyun 249*4882a593SmuzhiyunIl primo passo consiste semplicemente nel fare attenzione agli avvertimenti 250*4882a593Smuzhiyunproveniente dal compilatore. Versioni moderne di gcc possono individuare 251*4882a593Smuzhiyun(e segnalare) un gran numero di potenziali errori. Molto spesso, questi 252*4882a593Smuzhiyunavvertimenti indicano problemi reali. Di regola, il codice inviato per la 253*4882a593Smuzhiyunrevisione non dovrebbe produrre nessun avvertimento da parte del compilatore. 254*4882a593SmuzhiyunPer mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali 255*4882a593Smuzhiyune cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza 256*4882a593Smuzhiyunperò averne trovato la causa. 257*4882a593Smuzhiyun 258*4882a593SmuzhiyunTenete a mente che non tutti gli avvertimenti sono disabilitati di default. 259*4882a593SmuzhiyunCostruite il kernel con "make EXTRA_CFLAGS=-W" per ottenerli tutti. 260*4882a593Smuzhiyun 261*4882a593SmuzhiyunIl kernel fornisce differenti opzioni che abilitano funzionalità di debugging; 262*4882a593Smuzhiyunmolti di queste sono trovano all'interno del sotto menu "kernel hacking". 263*4882a593SmuzhiyunLa maggior parte di queste opzioni possono essere attivate per qualsiasi 264*4882a593Smuzhiyunkernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste 265*4882a593Smuzhiyunattivare: 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun - ENABLE_MUST_CHECK e FRAME_WARN per ottenere degli 268*4882a593Smuzhiyun avvertimenti dedicati a problemi come l'uso di interfacce deprecate o 269*4882a593Smuzhiyun l'ignorare un importante valore di ritorno di una funzione. Il risultato 270*4882a593Smuzhiyun generato da questi avvertimenti può risultare verboso, ma non bisogna 271*4882a593Smuzhiyun preoccuparsi per gli avvertimenti provenienti da altre parti del kernel. 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di 274*4882a593Smuzhiyun diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito 275*4882a593Smuzhiyun fuori controllo. Se state aggiungendo un sottosistema che crea (ed 276*4882a593Smuzhiyun esporta) oggetti complessi propri, considerate l'aggiunta di un supporto 277*4882a593Smuzhiyun al debugging dell'oggetto. 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; 280*4882a593Smuzhiyun esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo. 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo 283*4882a593Smuzhiyun numero di errori comuni di sincronizzazione. 284*4882a593Smuzhiyun 285*4882a593SmuzhiyunEsistono ancora delle altre opzioni di debugging, di alcune di esse 286*4882a593Smuzhiyundiscuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero 287*4882a593Smuzhiyunessere usate tutte le volte. Ma qualche volta il tempo speso nell'capire 288*4882a593Smuzhiyunle opzioni disponibili porterà ad un risparmio di tempo nel breve termine. 289*4882a593Smuzhiyun 290*4882a593SmuzhiyunUno degli strumenti di debugging più tosti è il *locking checker*, o 291*4882a593Smuzhiyun"lockdep". Questo strumento traccerà qualsiasi acquisizione e rilascio di 292*4882a593Smuzhiyunogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock* 293*4882a593Smuzhiyunsono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di 294*4882a593Smuzhiyuninterruzione, eccetera. Inoltre esso può assicurare che i *lock* vengano 295*4882a593Smuzhiyunacquisiti sempre nello stesso ordine, che le stesse assunzioni sulle 296*4882a593Smuzhiyuninterruzioni si applichino in tutte le occasioni, e così via. In altre parole, 297*4882a593Smuzhiyunlockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari 298*4882a593Smuzhiyuncasi, trovarsi in stallo. Questa tipologia di problema può essere grave 299*4882a593Smuzhiyun(sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep 300*4882a593Smuzhiyunpermette di trovare tali problemi automaticamente e in anticipo. 301*4882a593Smuzhiyun 302*4882a593SmuzhiyunIn qualità di programmatore kernel diligente, senza dubbio, dovrete controllare 303*4882a593Smuzhiyunil valore di ritorno di ogni operazione (come l'allocazione della memoria) 304*4882a593Smuzhiyunpoiché esso potrebbe fallire. Il nocciolo della questione è che i percorsi 305*4882a593Smuzhiyundi gestione degli errori, con grande probabilità, non sono mai stati 306*4882a593Smuzhiyuncollaudati del tutto. Il codice collaudato tende ad essere codice bacato; 307*4882a593Smuzhiyunpotrete quindi essere più a vostro agio con il vostro codice se tutti questi 308*4882a593Smuzhiyunpercorsi fossero stati verificati un po' di volte. 309*4882a593Smuzhiyun 310*4882a593SmuzhiyunIl kernel fornisce un framework per l'inserimento di fallimenti che fa 311*4882a593Smuzhiyunesattamente al caso, specialmente dove sono coinvolte allocazioni di memoria. 312*4882a593SmuzhiyunCon l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale 313*4882a593Smuzhiyundi allocazione di memoria sarà destinata al fallimento; questi fallimenti 314*4882a593Smuzhiyunpossono essere ridotti ad uno specifico pezzo di codice. Procedere con 315*4882a593Smuzhiyunl'inserimento dei fallimenti attivo permette al programmatore di verificare 316*4882a593Smuzhiyuncome il codice risponde quando le cose vanno male. Consultate: 317*4882a593SmuzhiyunDocumentation/fault-injection/fault-injection.rst per avere maggiori 318*4882a593Smuzhiyuninformazioni su come utilizzare questo strumento. 319*4882a593Smuzhiyun 320*4882a593SmuzhiyunAltre tipologie di errori possono essere riscontrati con lo strumento di 321*4882a593Smuzhiyunanalisi statica "sparse". Con Sparse, il programmatore può essere avvisato 322*4882a593Smuzhiyuncirca la confusione tra gli indirizzi dello spazio utente e dello spazio 323*4882a593Smuzhiyunkernel, un miscuglio fra quantità big-endian e little-endian, il passaggio 324*4882a593Smuzhiyundi un valore intero dove ci sia aspetta un gruppo di flag, e così via. 325*4882a593SmuzhiyunSparse deve essere installato separatamente (se il vostra distribuzione non 326*4882a593Smuzhiyunlo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page); 327*4882a593Smuzhiyunpuò essere attivato sul codice aggiungendo "C=1" al comando make. 328*4882a593Smuzhiyun 329*4882a593SmuzhiyunLo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare 330*4882a593Smuzhiyununa vasta varietà di potenziali problemi di codifica; e può inoltre proporre 331*4882a593Smuzhiyunsoluzioni per risolverli. Un buon numero di "patch semantiche" per il kernel 332*4882a593Smuzhiyunsono state preparate nella cartella scripts/coccinelle; utilizzando 333*4882a593Smuzhiyun"make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su 334*4882a593Smuzhiyunqualsiasi problema trovato. Per maggiori informazioni, consultate 335*4882a593Smuzhiyun:ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`. 336*4882a593Smuzhiyun 337*4882a593SmuzhiyunAltri errori di portabilità sono meglio scovati compilando il vostro codice 338*4882a593Smuzhiyunper altre architetture. Se non vi accade di avere un sistema S/390 o una 339*4882a593Smuzhiyunscheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase 340*4882a593Smuzhiyundi compilazione. Un vasto numero di cross-compilatori per x86 possono 341*4882a593Smuzhiyunessere trovati al sito: 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun http://www.kernel.org/pub/tools/crosstool/ 344*4882a593Smuzhiyun 345*4882a593SmuzhiyunIl tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto 346*4882a593Smuzhiyunnell'evitare situazioni imbarazzanti nel futuro. 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun 349*4882a593SmuzhiyunDocumentazione 350*4882a593Smuzhiyun-------------- 351*4882a593Smuzhiyun 352*4882a593SmuzhiyunLa documentazione è spesso stata più un'eccezione che una regola nello 353*4882a593Smuzhiyunsviluppo del kernel. Nonostante questo, un'adeguata documentazione aiuterà 354*4882a593Smuzhiyuna facilitare l'inserimento di nuovo codice nel kernel, rende la vita più 355*4882a593Smuzhiyunfacile per gli altri sviluppatori e sarà utile per i vostri utenti. In molti 356*4882a593Smuzhiyuncasi, la documentazione è divenuta sostanzialmente obbligatoria. 357*4882a593Smuzhiyun 358*4882a593SmuzhiyunLa prima parte di documentazione per qualsiasi patch è il suo changelog. 359*4882a593SmuzhiyunQuesti dovrebbero descrivere le problematiche risolte, la tipologia di 360*4882a593Smuzhiyunsoluzione, le persone che lavorano alla patch, ogni effetto rilevante 361*4882a593Smuzhiyunsulle prestazioni e tutto ciò che può servire per la comprensione della 362*4882a593Smuzhiyunpatch. Assicuratevi che il changelog dica *perché*, vale la pena aggiungere 363*4882a593Smuzhiyunla patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale 364*4882a593Smuzhiyuninformazione. 365*4882a593Smuzhiyun 366*4882a593SmuzhiyunQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi 367*4882a593Smuzhiyunnuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale 368*4882a593Smuzhiyuninterfaccia così da permette agli sviluppatori dello spazio utente di sapere 369*4882a593Smuzhiyuncon cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una 370*4882a593Smuzhiyundescrizione di come questi documenti devono essere impostati e quali 371*4882a593Smuzhiyuninformazioni devono essere fornite. 372*4882a593Smuzhiyun 373*4882a593SmuzhiyunIl file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>` 374*4882a593Smuzhiyundescrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga 375*4882a593Smuzhiyunnuovi parametri dovrebbe aggiungere nuove voci a questo file. 376*4882a593Smuzhiyun 377*4882a593SmuzhiyunOgni nuova configurazione deve essere accompagnata da un testo di supporto 378*4882a593Smuzhiyunche spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle 379*4882a593Smuzhiyunselezionare. 380*4882a593Smuzhiyun 381*4882a593SmuzhiyunPer molti sottosistemi le informazioni sull'API interna sono documentate sotto 382*4882a593Smuzhiyunforma di commenti formattati in maniera particolare; questi commenti possono 383*4882a593Smuzhiyunessere estratti e formattati in differenti modi attraverso lo script 384*4882a593Smuzhiyun"kernel-doc". Se state lavorando all'interno di un sottosistema che ha 385*4882a593Smuzhiyuncommenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata, 386*4882a593Smuzhiyunper le funzioni disponibili esternamente. Anche in aree che non sono molto 387*4882a593Smuzhiyundocumentate, non c'è motivo per non aggiungere commenti kerneldoc per il 388*4882a593Smuzhiyunfuturo; infatti, questa può essere un'attività utile per sviluppatori novizi 389*4882a593Smuzhiyundel kernel. Il formato di questi commenti, assieme alle informazione su come 390*4882a593Smuzhiyuncreare modelli per kerneldoc, possono essere trovati in 391*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`. 392*4882a593Smuzhiyun 393*4882a593SmuzhiyunChiunque legga un ammontare significativo di codice kernel noterà che, spesso, 394*4882a593Smuzhiyuni commenti si fanno maggiormente notare per la loro assenza. Ancora una volta, 395*4882a593Smuzhiyunle aspettative verso il nuovo codice sono più alte rispetto al passato; 396*4882a593Smuzhiyuninserire codice privo di commenti sarà più difficile. Detto ciò, va aggiunto 397*4882a593Smuzhiyunche non si desiderano commenti prolissi per il codice. Il codice dovrebbe 398*4882a593Smuzhiyunessere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più 399*4882a593Smuzhiyunsottili. 400*4882a593Smuzhiyun 401*4882a593SmuzhiyunDeterminate cose dovrebbero essere sempre commentate. L'uso di barriere 402*4882a593Smuzhiyundi memoria dovrebbero essere accompagnate da una riga che spieghi perché sia 403*4882a593Smuzhiyunnecessaria. Le regole di sincronizzazione per le strutture dati, generalmente, 404*4882a593Smuzhiyunnecessitano di una spiegazioni da qualche parte. Le strutture dati più 405*4882a593Smuzhiyunimportanti, in generale, hanno bisogno di una documentazione onnicomprensiva. 406*4882a593SmuzhiyunLe dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere 407*4882a593Smuzhiyunindicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare 408*4882a593Smuzhiyununa "pulizia" incorretta, ha bisogno di un commento che dica perché è stato 409*4882a593Smuzhiyunfatto in quel modo. E così via. 410*4882a593Smuzhiyun 411*4882a593SmuzhiyunCambiamenti interni dell'API 412*4882a593Smuzhiyun---------------------------- 413*4882a593Smuzhiyun 414*4882a593SmuzhiyunL'interfaccia binaria fornita dal kernel allo spazio utente non può essere 415*4882a593Smuzhiyunrotta tranne che in circostanze eccezionali. L'interfaccia di programmazione 416*4882a593Smuzhiyuninterna al kernel, invece, è estremamente fluida e può essere modificata al 417*4882a593Smuzhiyunbisogno. Se vi trovate a dover lavorare attorno ad un'API del kernel o 418*4882a593Smuzhiyunsemplicemente non state utilizzando una funzionalità offerta perché questa 419*4882a593Smuzhiyunnon rispecchia i vostri bisogni, allora questo potrebbe essere un segno che 420*4882a593Smuzhiyunl'API ha bisogno di essere cambiata. In qualità di sviluppatore del kernel, 421*4882a593Smuzhiyunhai il potere di fare questo tipo di modifica. 422*4882a593Smuzhiyun 423*4882a593SmuzhiyunCi sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere 424*4882a593Smuzhiyunfatti, ma devono essere giustificati. Quindi ogni patch che porta ad una 425*4882a593Smuzhiyunmodifica dell'API interna dovrebbe essere accompagnata da una descrizione 426*4882a593Smuzhiyundella modifica in sé e del perché essa è necessaria. Questo tipo di 427*4882a593Smuzhiyuncambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di 428*4882a593Smuzhiyunessere sepolti all'interno di una patch più grande. 429*4882a593Smuzhiyun 430*4882a593SmuzhiyunL'altro punto da cogliere consiste nel fatto che uno sviluppatore che 431*4882a593Smuzhiyunmodifica l'API deve, in generale, essere responsabile della correzione 432*4882a593Smuzhiyundi tutto il codice del kernel che viene rotto per via della sua modifica. 433*4882a593SmuzhiyunPer una funzione ampiamente usata, questo compito può condurre letteralmente 434*4882a593Smuzhiyuna centinaia o migliaia di modifiche, molte delle quali sono in conflitto con 435*4882a593Smuzhiyunil lavoro svolto da altri sviluppatori. Non c'è bisogno di dire che questo 436*4882a593Smuzhiyunpuò essere un lavoro molto grosso, quindi è meglio essere sicuri che la 437*4882a593Smuzhiyunmotivazione sia ben solida. Notate che lo strumento Coccinelle può fornire 438*4882a593Smuzhiyunun aiuto con modifiche estese dell'API. 439*4882a593Smuzhiyun 440*4882a593SmuzhiyunQuando viene fatta una modifica API incompatibile, una persona dovrebbe, 441*4882a593Smuzhiyunquando possibile, assicurarsi che quel codice non aggiornato sia trovato 442*4882a593Smuzhiyundal compilatore. Questo vi aiuterà ad essere sicuri d'avere trovato, 443*4882a593Smuzhiyuntutti gli usi di quell'interfaccia. Inoltre questo avviserà gli sviluppatori 444*4882a593Smuzhiyundi codice fuori dal kernel che c'è un cambiamento per il quale è necessario del 445*4882a593Smuzhiyunlavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli 446*4882a593Smuzhiyunsviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere 447*4882a593Smuzhiyunpiù difficile del necessario la vita agli sviluppatori di questo codice. 448