xref: /openbmc/linux/Documentation/translations/it_IT/process/4.Coding.rst (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1edba5eecSFederico Vaga.. include:: ../disclaimer-ita.rst
2edba5eecSFederico Vaga
3edba5eecSFederico Vaga:Original: :ref:`Documentation/process/4.Coding.rst <development_coding>`
4fdf0345eSFederico Vaga:Translator: Alessia Mantegazza <amantegazza@vaga.pv.it>
5edba5eecSFederico Vaga
6edba5eecSFederico Vaga.. _it_development_coding:
7edba5eecSFederico Vaga
8edba5eecSFederico VagaScrivere codice corretto
9edba5eecSFederico Vaga========================
10edba5eecSFederico Vaga
11fdf0345eSFederico VagaNonostante ci sia molto da dire sul processo di creazione, sulla sua solidità
12fdf0345eSFederico Vagae sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo
13fdf0345eSFederico Vagadel kernel si trova nel codice stesso.  È il codice che sarà esaminato dagli
14fdf0345eSFederico Vagaaltri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la
15fdf0345eSFederico Vagaqualità di questo codice che determinerà il successo finale del progetto.
16edba5eecSFederico Vaga
17fdf0345eSFederico VagaQuesta sezione esaminerà il processo di codifica.  Inizieremo con uno sguardo
18fdf0345eSFederico Vagasulle diverse casistiche nelle quali gli sviluppatori kernel possono
19fdf0345eSFederico Vagasbagliare.  Poi, l'attenzione si sposterà verso "il fare le cose
20fdf0345eSFederico Vagacorrettamente" e sugli strumenti che possono essere utili in questa missione.
21fdf0345eSFederico Vaga
22fdf0345eSFederico VagaTrappole
23fdf0345eSFederico Vaga--------
24fdf0345eSFederico Vaga
25fdf0345eSFederico VagaLo stile del codice
26fdf0345eSFederico Vaga*******************
27fdf0345eSFederico Vaga
28fdf0345eSFederico VagaIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in
29fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`.
30fdf0345eSFederico VagaPer la maggior parte del tempo, la politica descritta in quel file è stata
31fdf0345eSFederico Vagapraticamente informativa.  Ne risulta che ci sia una quantità sostanziale di
32fdf0345eSFederico Vagacodice nel kernel che non rispetta le linee guida relative allo stile.
33fdf0345eSFederico VagaLa presenza di quel codice conduce a due distinti pericoli per gli
34fdf0345eSFederico Vagasviluppatori kernel.
35fdf0345eSFederico Vaga
36fdf0345eSFederico VagaIl primo di questi è credere che gli standard di codifica del kernel
37fdf0345eSFederico Vaganon sono importanti e possono non essere applicati.  La verità è che
38fdf0345eSFederico Vagaaggiungere nuovo codice al kernel è davvero difficile se questo non
39fdf0345eSFederico Vagarispetta le norme; molti sviluppatori richiederanno che il codice sia
40fdf0345eSFederico Vagariformulato prima che anche solo lo revisionino.  Una base di codice larga
41fdf0345eSFederico Vagaquanto il kernel richiede una certa uniformità, in modo da rendere possibile
42fdf0345eSFederico Vagaper gli sviluppatori una comprensione veloce di ogni sua parte.  Non ci sono,
43fdf0345eSFederico Vagaquindi, più spazi per un codice formattato alla carlona.
44fdf0345eSFederico Vaga
45fdf0345eSFederico VagaOccasionalmente, lo stile di codifica del kernel andrà in conflitto con lo
46fdf0345eSFederico Vagastile richiesto da un datore di lavoro.  In alcuni casi, lo stile del kernel
47fdf0345eSFederico Vagadovrà prevalere prima che il codice venga inserito.  Mettere il codice
48fdf0345eSFederico Vagaall'interno del kernel significa rinunciare a un certo grado di controllo
49fdf0345eSFederico Vagain differenti modi - incluso il controllo sul come formattare il codice.
50fdf0345eSFederico Vaga
51fdf0345eSFederico VagaL’altra trappola è quella di pensare che il codice già presente nel kernel
52fdf0345eSFederico Vagaabbia urgentemente bisogno di essere sistemato.  Gli sviluppatori potrebbero
53fdf0345eSFederico Vagainiziare a generare patch che correggono lo stile come modo per prendere
54fdf0345eSFederico Vagafamigliarità con il processo, o come modo per inserire i propri nomi nei
55fdf0345eSFederico Vagachangelog del kernel – o entrambe.  La comunità di sviluppo vede un attività
56fdf0345eSFederico Vagadi codifica puramente correttiva come "rumore"; queste attività riceveranno
57fdf0345eSFederico Vagauna fredda accoglienza.  Di conseguenza è meglio evitare questo tipo di patch.
58fdf0345eSFederico VagaMentre si lavora su un pezzo di codice è normale correggerne anche lo stile,
59fdf0345eSFederico Vagama le modifiche di stile non dovrebbero essere fatte fini a se stesse.
60fdf0345eSFederico Vaga
61fdf0345eSFederico VagaIl documento sullo stile del codice non dovrebbe essere letto come una legge
62fdf0345eSFederico Vagaassoluta che non può mai essere trasgredita.  Se c’è un a buona ragione
63fdf0345eSFederico Vaga(per esempio, una linea che diviene poco leggibile se divisa per rientrare
64fdf0345eSFederico Vaganel limite di 80 colonne), fatelo e basta.
65fdf0345eSFederico Vaga
66fdf0345eSFederico VagaNotate che potete utilizzare lo strumento “clang-format” per aiutarvi con
67fdf0345eSFederico Vagale regole, per una riformattazione automatica e veloce del vostro codice
68fdf0345eSFederico Vagae per revisionare interi file per individuare errori nello stile di codifica,
69fdf0345eSFederico Vagarefusi e possibili miglioramenti.  Inoltre è utile anche per classificare gli
70fdf0345eSFederico Vaga``#includes``, per allineare variabili/macro, per testi derivati ed altri
71fdf0345eSFederico Vagacompiti del genere.  Consultate il file
72fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>`
73fdf0345eSFederico Vagaper maggiori dettagli
74fdf0345eSFederico Vaga
75fdf0345eSFederico Vaga
76fdf0345eSFederico VagaLivelli di astrazione
77fdf0345eSFederico Vaga*********************
78fdf0345eSFederico Vaga
79fdf0345eSFederico Vaga
80fdf0345eSFederico VagaI professori di Informatica insegnano ai propri studenti a fare ampio uso dei
81fdf0345eSFederico Vagalivelli di astrazione nel nome della flessibilità e del nascondere informazioni.
82fdf0345eSFederico VagaCerto il kernel fa un grande uso dell'astrazione; nessun progetto con milioni
83fdf0345eSFederico Vagadi righe di codice potrebbe fare altrimenti e sopravvivere.  Ma l'esperienza
84fdf0345eSFederico Vagaha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa
85fdf0345eSFederico Vagaal pari di una prematura ottimizzazione.  L'astrazione dovrebbe essere usata
86fdf0345eSFederico Vagafino al livello necessario e non oltre.
87fdf0345eSFederico Vaga
88fdf0345eSFederico VagaAd un livello base, considerate una funzione che ha un argomento che viene
89fdf0345eSFederico Vagasempre impostato a zero da tutti i chiamanti.  Uno potrebbe mantenere
90fdf0345eSFederico Vagaquell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità
91fdf0345eSFederico Vagaofferta.  In ogni caso, tuttavia, ci sono buone possibilità che il codice
92fdf0345eSFederico Vagache va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera
93fdf0345eSFederico Vagasottile, in un modo che non è mai stato notato - perché non è mai stato usato.
94fdf0345eSFederico VagaOppure, quando sorge la necessità di avere più flessibilità, questo argomento
95fdf0345eSFederico Vaganon la fornisce in maniera soddisfacente.  Gli sviluppatori di Kernel,
96fdf0345eSFederico Vagasottopongono costantemente patch che vanno a rimuovere gli argomenti
97fdf0345eSFederico Vagainutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti.
98fdf0345eSFederico Vaga
99fdf0345eSFederico VagaI livelli di astrazione che nascondono l'accesso all'hardware -
100fdf0345eSFederico Vagaspesso per poter usare dei driver su diversi sistemi operativi - vengono
101fdf0345eSFederico Vagaparticolarmente disapprovati.  Tali livelli oscurano il codice e possono
102fdf0345eSFederico Vagapeggiorare le prestazioni; essi non appartengono al kernel Linux.
103fdf0345eSFederico Vaga
104fdf0345eSFederico VagaD'altro canto, se vi ritrovate a dover copiare una quantità significativa di
105fdf0345eSFederico Vagacodice proveniente da un altro sottosistema del kernel, è tempo di chiedersi
106fdf0345eSFederico Vagase, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo
107fdf0345eSFederico Vagain una libreria separata o di implementare quella funzionalità ad un livello
108fdf0345eSFederico Vagapiù elevato.  Non c'è utilità nel replicare lo stesso codice per tutto
109fdf0345eSFederico Vagail kernel.
110fdf0345eSFederico Vaga
111fdf0345eSFederico Vaga
112fdf0345eSFederico Vaga#ifdef e l'uso del preprocessore in generale
113fdf0345eSFederico Vaga********************************************
114fdf0345eSFederico Vaga
115fdf0345eSFederico VagaIl preprocessore C sembra essere una fonte di attrazione per qualche
116fdf0345eSFederico Vagaprogrammatore C, che ci vede una via per ottenere una grande flessibilità
117fdf0345eSFederico Vagaall'interno di un file sorgente.  Ma il preprocessore non è scritto in C,
118fdf0345eSFederico Vagae un suo massiccio impiego conduce a un codice che è molto più difficile
119fdf0345eSFederico Vagada leggere per gli altri e che rende più difficile il lavoro di verifica del
120fdf0345eSFederico Vagacompilatore.  L'uso eccessivo del preprocessore è praticamente sempre il segno
121fdf0345eSFederico Vagadi un codice che necessita di un certo lavoro di pulizia.
122fdf0345eSFederico Vaga
123fdf0345eSFederico VagaLa compilazione condizionata con #ifdef è, in effetti, un potente strumento,
124fdf0345eSFederico Vagaed esso viene usato all'interno del kernel.  Ma esiste un piccolo desiderio:
125fdf0345eSFederico Vagaquello di vedere il codice coperto solo da una leggera spolverata di
126fdf0345eSFederico Vagablocchi #ifdef.  Come regola generale, quando possibile, l'uso di #ifdef
127fdf0345eSFederico Vagadovrebbe essere confinato nei file d'intestazione.  Il codice compilato
128fdf0345eSFederico Vagacondizionatamente può essere confinato a funzioni tali che, nel caso in cui
129fdf0345eSFederico Vagail codice non deve essere presente, diventano vuote.  Il compilatore poi
130fdf0345eSFederico Vagaottimizzerà la chiamata alla funzione vuota rimuovendola.  Il risultato è
131fdf0345eSFederico Vagaun codice molto più pulito, più facile da seguire.
132fdf0345eSFederico Vaga
133fdf0345eSFederico VagaLe macro del preprocessore C presentano una serie di pericoli, inclusi
134fdf0345eSFederico Vagavalutazioni multiple di espressioni che hanno effetti collaterali e non
135fdf0345eSFederico Vagagarantiscono una sicurezza rispetto ai tipi.  Se siete tentati dal definire
136fdf0345eSFederico Vagauna macro, considerate l'idea di creare invece una funzione inline.  Il codice
137fdf0345eSFederico Vagache ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili,
138fdf0345eSFederico Vaganon considerano i propri argomenti più volte, e permettono al compilatore di
139fdf0345eSFederico Vagaeffettuare controlli sul tipo degli argomenti e del valore di ritorno.
140fdf0345eSFederico Vaga
141fdf0345eSFederico Vaga
142fdf0345eSFederico VagaFunzioni inline
143fdf0345eSFederico Vaga***************
144fdf0345eSFederico Vaga
145fdf0345eSFederico VagaComunque, anche le funzioni inline hanno i loro pericoli.  I programmatori
146fdf0345eSFederico Vagapotrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione
147fdf0345eSFederico Vagadi una chiamata a funzione.  Queste funzioni, tuttavia, possono ridurre le
148fdf0345eSFederico Vagaprestazioni.  Dato che il loro codice viene replicato ovunque vi sia una
149fdf0345eSFederico Vagachiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato.
150fdf0345eSFederico VagaQuesti, a turno, creano pressione sulla memoria cache del processore, e questo
151fdf0345eSFederico Vagapuò causare rallentamenti importanti.  Le funzioni inline, di norma, dovrebbero
152fdf0345eSFederico Vagaessere piccole e usate raramente.  Il costo di una chiamata a funzione, dopo
153fdf0345eSFederico Vagatutto, non è così alto; la creazione di molte funzioni inline è il classico
154fdf0345eSFederico Vagaesempio di un'ottimizzazione prematura.
155fdf0345eSFederico Vaga
156fdf0345eSFederico VagaIn generale, i programmatori del kernel ignorano gli effetti della cache a
157fdf0345eSFederico Vagaloro rischio e pericolo.  Il classico compromesso tempo/spazio teorizzato
158fdf0345eSFederico Vagaall'inizio delle lezioni sulle strutture dati spesso non si applica
159fdf0345eSFederico Vagaall'hardware moderno.  Lo spazio *è* tempo, in questo senso un programma
160fdf0345eSFederico Vagapiù grande sarà più lento rispetto ad uno più compatto.
161fdf0345eSFederico Vaga
162fdf0345eSFederico VagaI compilatori più recenti hanno preso un ruolo attivo nel decidere se
163fdf0345eSFederico Vagauna data funzione deve essere resa inline oppure no.  Quindi l'uso
164fdf0345eSFederico Vagaindiscriminato della parola chiave "inline" potrebbe non essere non solo
165fdf0345eSFederico Vagaeccessivo, ma anche irrilevante.
166fdf0345eSFederico Vaga
167fdf0345eSFederico VagaSincronizzazione
168fdf0345eSFederico Vaga****************
169fdf0345eSFederico Vaga
170fdf0345eSFederico VagaNel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna
171fdf0345eSFederico Vagasotto la licenza GPL e reso disponibile per la sua inclusione nella ramo
172fdf0345eSFederico Vagaprincipale del kernel.  Questa donazione fu una notizia bene accolta;
173fdf0345eSFederico Vagail supporto per le reti senza fili era considerata, nel migliore dei casi,
174fdf0345eSFederico Vagaal di sotto degli standard; il sistema Deviscape offrì la promessa di una
175fdf0345eSFederico Vagarisoluzione a tale situazione.  Tuttavia, questo codice non fu inserito nel
176fdf0345eSFederico Vagaramo principale fino al giugno del 2007 (2.6.22). Cosa accadde?
177fdf0345eSFederico Vaga
178fdf0345eSFederico VagaQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto
179fdf0345eSFederico Vagaa porte chiuse.  Ma in particolare, un grosso problema fu che non fu
180fdf0345eSFederico Vagaprogettato per girare in un sistema multiprocessore.  Prima che questo
181fdf0345eSFederico Vagasistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario
182fdf0345eSFederico Vagaun lavoro sugli schemi di sincronizzazione.
183fdf0345eSFederico Vaga
184fdf0345eSFederico VagaUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare
185fdf0345eSFederico Vagaai problemi di concorrenza presenti nei sistemi multiprocessore.  Ora,
186fdf0345eSFederico Vagacomunque, questo documento è stato scritto su di un portatile dual-core.
187fdf0345eSFederico VagaPersino su sistemi a singolo processore, il lavoro svolto per incrementare
188fdf0345eSFederico Vagala capacità di risposta aumenterà il livello di concorrenza interno al kernel.
189fdf0345eSFederico VagaI giorni nei quali il codice poteva essere scritto senza pensare alla
190fdf0345eSFederico Vagasincronizzazione sono da passati tempo.
191fdf0345eSFederico Vaga
192fdf0345eSFederico VagaOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe
193fdf0345eSFederico Vagaavere accesso simultaneo da più di un thread deve essere sincronizzato.  Il
194fdf0345eSFederico Vaganuovo codice dovrebbe essere scritto avendo tale accortezza in testa;
195fdf0345eSFederico Vagariadattare la sincronizzazione a posteriori è un compito molto più difficile.
196fdf0345eSFederico VagaGli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene
197fdf0345eSFederico Vagale primitive di sincronizzazione, in modo da sceglier lo strumento corretto
198fdf0345eSFederico Vagaper eseguire un compito.  Il codice che presenta una mancanza di attenzione
199fdf0345eSFederico Vagaalla concorrenza avrà un percorso difficile all'interno del ramo principale.
200fdf0345eSFederico Vaga
201fdf0345eSFederico VagaRegressioni
202fdf0345eSFederico Vaga***********
203fdf0345eSFederico Vaga
204fdf0345eSFederico VagaVale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante
205fdf0345eSFederico Vagal'idea di eseguire un cambiamento (che potrebbe portare a grandi
206fdf0345eSFederico Vagamiglioramenti) che porterà ad alcune rotture per gli utenti esistenti.
207fdf0345eSFederico VagaQuesta tipologia di cambiamento è chiamata "regressione", e le regressioni son
208fdf0345eSFederico Vagadiventate mal viste nel ramo principale del kernel.  Con alcune eccezioni,
209fdf0345eSFederico Vagai cambiamenti che causano regressioni saranno fermati se quest'ultime non
210fdf0345eSFederico Vagapotranno essere corrette in tempo utile.  È molto meglio quindi evitare
211fdf0345eSFederico Vagala regressione fin dall'inizio.
212fdf0345eSFederico Vaga
213fdf0345eSFederico VagaSpesso si è argomentato che una regressione può essere giustificata se essa
214fdf0345eSFederico Vagaporta risolve più problemi di quanti non ne crei.  Perché, dunque, non fare
215fdf0345eSFederico Vagaun cambiamento se questo porta a nuove funzionalità a dieci sistemi per
216fdf0345eSFederico Vagaognuno dei quali esso determina una rottura?  La migliore risposta a questa
217fdf0345eSFederico Vagadomanda ci è stata fornita da Linus nel luglio 2007:
218fdf0345eSFederico Vaga
219fdf0345eSFederico Vaga::
220fdf0345eSFederico Vaga   Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella
221fdf0345eSFederico Vaga   via nasconde insidie, e nessuno può sapere del tutto se state facendo
222fdf0345eSFederico Vaga   dei progressi reali. Sono due passi avanti e uno indietro, oppure
223fdf0345eSFederico Vaga   un passo avanti e due indietro?
224fdf0345eSFederico Vaga
225fdf0345eSFederico Vaga(http://lwn.net/Articles/243460/).
226fdf0345eSFederico Vaga
227fdf0345eSFederico VagaUna particolare tipologia di regressione mal vista consiste in una qualsiasi
228fdf0345eSFederico Vagasorta di modifica all'ABI dello spazio utente.  Una volta che un'interfaccia
229fdf0345eSFederico Vagaviene esportata verso lo spazio utente, dev'essere supportata all'infinito.
230fdf0345eSFederico VagaQuesto fatto rende la creazione di interfacce per lo spazio utente
231fdf0345eSFederico Vagaparticolarmente complicato: dato che non possono venir cambiate introducendo
232fdf0345eSFederico Vagaincompatibilità, esse devono essere fatte bene al primo colpo.  Per questa
233fdf0345eSFederico Vagaragione sono sempre richieste: ampie riflessioni, documentazione chiara e
234fdf0345eSFederico Vagaampie revisioni dell'interfaccia verso lo spazio utente.
235fdf0345eSFederico Vaga
236fdf0345eSFederico Vaga
237fdf0345eSFederico VagaStrumenti di verifica del codice
238fdf0345eSFederico Vaga--------------------------------
239fdf0345eSFederico VagaAlmeno per ora la scrittura di codice priva di errori resta un ideale
240fdf0345eSFederico Vagairraggiungibile ai più.  Quello che speriamo di poter fare, tuttavia, è
241fdf0345eSFederico Vagatrovare e correggere molti di questi errori prima che il codice entri nel
242fdf0345eSFederico Vagaramo principale del kernel.  A tal scopo gli sviluppatori del kernel devono
243fdf0345eSFederico Vagamettere insieme una schiera impressionante di strumenti che possano
244fdf0345eSFederico Vagalocalizzare automaticamente un'ampia varietà di problemi.  Qualsiasi problema
245fdf0345eSFederico Vagatrovato dal computer è un problema che non affliggerà l'utente in seguito,
246fdf0345eSFederico Vagane consegue che gli strumenti automatici dovrebbero essere impiegati ovunque
247fdf0345eSFederico Vagapossibile.
248fdf0345eSFederico Vaga
249fdf0345eSFederico VagaIl primo passo consiste semplicemente nel fare attenzione agli avvertimenti
250fdf0345eSFederico Vagaproveniente dal compilatore.  Versioni moderne di gcc possono individuare
251fdf0345eSFederico Vaga(e segnalare) un gran numero di potenziali errori.  Molto spesso, questi
252fdf0345eSFederico Vagaavvertimenti indicano problemi reali.  Di regola, il codice inviato per la
253fdf0345eSFederico Vagarevisione non dovrebbe produrre nessun avvertimento da parte del compilatore.
254fdf0345eSFederico VagaPer mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali
255fdf0345eSFederico Vagae cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza
256fdf0345eSFederico Vagaperò averne trovato la causa.
257fdf0345eSFederico Vaga
258fdf0345eSFederico VagaTenete a mente che non tutti gli avvertimenti sono disabilitati di default.
259163ba35fSMasahiro YamadaCostruite il kernel con "make KCFLAGS=-W" per ottenerli tutti.
260fdf0345eSFederico Vaga
261fdf0345eSFederico VagaIl kernel fornisce differenti opzioni che abilitano funzionalità di debugging;
262fdf0345eSFederico Vagamolti di queste sono trovano all'interno del sotto menu "kernel hacking".
263fdf0345eSFederico VagaLa maggior parte di queste opzioni possono essere attivate per qualsiasi
264fdf0345eSFederico Vagakernel utilizzato per lo sviluppo o a scopo di test.  In particolare dovreste
265fdf0345eSFederico Vagaattivare:
266fdf0345eSFederico Vaga
267*511aaf2bSFederico Vaga - FRAME_WARN per ottenere degli avvertimenti su stack frame più
268*511aaf2bSFederico Vaga   grandi di un dato valore.  Il risultato generato da questi
269*511aaf2bSFederico Vaga   avvertimenti può risultare verboso, ma non bisogna preoccuparsi per
270*511aaf2bSFederico Vaga   gli avvertimenti provenienti da altre parti del kernel.
271fdf0345eSFederico Vaga
272fdf0345eSFederico Vaga - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di
273fdf0345eSFederico Vaga   diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito
274fdf0345eSFederico Vaga   fuori controllo.  Se state aggiungendo un sottosistema che crea (ed
275fdf0345eSFederico Vaga   esporta) oggetti complessi propri, considerate l'aggiunta di un supporto
276fdf0345eSFederico Vaga   al debugging dell'oggetto.
277fdf0345eSFederico Vaga
278fdf0345eSFederico Vaga - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria;
279fdf0345eSFederico Vaga   esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo.
280fdf0345eSFederico Vaga
281fdf0345eSFederico Vaga - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo
282fdf0345eSFederico Vaga   numero di errori comuni di sincronizzazione.
283fdf0345eSFederico Vaga
284fdf0345eSFederico VagaEsistono ancora delle altre opzioni di debugging, di alcune di esse
285fdf0345eSFederico Vagadiscuteremo qui sotto.  Alcune di esse hanno un forte impatto e non dovrebbero
286fdf0345eSFederico Vagaessere usate tutte le volte.  Ma qualche volta il tempo speso nell'capire
287fdf0345eSFederico Vagale opzioni disponibili porterà ad un risparmio di tempo nel breve termine.
288fdf0345eSFederico Vaga
289fdf0345eSFederico VagaUno degli strumenti di debugging più tosti è il *locking checker*, o
290fdf0345eSFederico Vaga"lockdep".  Questo strumento traccerà qualsiasi acquisizione e rilascio di
291fdf0345eSFederico Vagaogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock*
292fdf0345eSFederico Vagasono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di
293fdf0345eSFederico Vagainterruzione, eccetera.  Inoltre esso può assicurare che i *lock* vengano
294fdf0345eSFederico Vagaacquisiti sempre nello stesso ordine, che le stesse assunzioni sulle
295fdf0345eSFederico Vagainterruzioni si applichino in tutte le occasioni, e così via.  In altre parole,
296fdf0345eSFederico Vagalockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari
297fdf0345eSFederico Vagacasi, trovarsi in stallo.  Questa tipologia di problema può essere grave
298fdf0345eSFederico Vaga(sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep
299fdf0345eSFederico Vagapermette di trovare tali problemi automaticamente e in anticipo.
300fdf0345eSFederico Vaga
301fdf0345eSFederico VagaIn qualità di programmatore kernel diligente, senza dubbio, dovrete controllare
302fdf0345eSFederico Vagail valore di ritorno di ogni operazione (come l'allocazione della memoria)
303fdf0345eSFederico Vagapoiché esso potrebbe fallire.  Il nocciolo della questione è che i percorsi
304fdf0345eSFederico Vagadi gestione degli errori, con grande probabilità, non sono mai stati
305fdf0345eSFederico Vagacollaudati del tutto.  Il codice collaudato tende ad essere codice bacato;
306fdf0345eSFederico Vagapotrete quindi essere più a vostro agio con il vostro codice se tutti questi
307fdf0345eSFederico Vagapercorsi fossero stati verificati un po' di volte.
308fdf0345eSFederico Vaga
309fdf0345eSFederico VagaIl kernel fornisce un framework per l'inserimento di fallimenti che fa
310fdf0345eSFederico Vagaesattamente al caso, specialmente dove sono coinvolte allocazioni di memoria.
311fdf0345eSFederico VagaCon l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale
312fdf0345eSFederico Vagadi allocazione di memoria sarà destinata al fallimento; questi fallimenti
313fdf0345eSFederico Vagapossono essere ridotti ad uno specifico pezzo di codice.  Procedere con
314fdf0345eSFederico Vagal'inserimento dei fallimenti attivo permette al programmatore di verificare
315fdf0345eSFederico Vagacome il codice risponde quando le cose vanno male.  Consultate:
31610ffebbeSMauro Carvalho ChehabDocumentation/fault-injection/fault-injection.rst per avere maggiori
317fdf0345eSFederico Vagainformazioni su come utilizzare questo strumento.
318fdf0345eSFederico Vaga
319fdf0345eSFederico VagaAltre tipologie di errori possono essere riscontrati con lo strumento di
320fdf0345eSFederico Vagaanalisi statica "sparse".  Con Sparse, il programmatore può essere avvisato
321fdf0345eSFederico Vagacirca la confusione tra gli indirizzi dello spazio utente e dello spazio
322fdf0345eSFederico Vagakernel, un miscuglio fra quantità big-endian e little-endian, il passaggio
323fdf0345eSFederico Vagadi un valore intero dove ci sia aspetta un gruppo di flag, e così via.
324fdf0345eSFederico VagaSparse deve essere installato separatamente (se il vostra distribuzione non
325fdf0345eSFederico Vagalo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page);
326fdf0345eSFederico Vagapuò essere attivato sul codice aggiungendo "C=1" al comando make.
327fdf0345eSFederico Vaga
328fdf0345eSFederico VagaLo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare
329fdf0345eSFederico Vagauna vasta varietà di potenziali problemi di codifica; e può inoltre proporre
330fdf0345eSFederico Vagasoluzioni per risolverli.  Un buon numero di "patch semantiche" per il kernel
331fdf0345eSFederico Vagasono state preparate nella cartella scripts/coccinelle; utilizzando
332fdf0345eSFederico Vaga"make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su
333fdf0345eSFederico Vagaqualsiasi problema trovato.  Per maggiori informazioni, consultate
334fdf0345eSFederico Vaga:ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`.
335fdf0345eSFederico Vaga
336fdf0345eSFederico VagaAltri errori di portabilità sono meglio scovati compilando il vostro codice
337fdf0345eSFederico Vagaper altre architetture.  Se non vi accade di avere un sistema S/390 o una
338fdf0345eSFederico Vagascheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase
339fdf0345eSFederico Vagadi compilazione.  Un vasto numero di cross-compilatori per x86 possono
340fdf0345eSFederico Vagaessere trovati al sito:
341fdf0345eSFederico Vaga
342fdf0345eSFederico Vaga	http://www.kernel.org/pub/tools/crosstool/
343fdf0345eSFederico Vaga
344fdf0345eSFederico VagaIl tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto
345fdf0345eSFederico Vaganell'evitare situazioni imbarazzanti nel futuro.
346fdf0345eSFederico Vaga
347fdf0345eSFederico Vaga
348fdf0345eSFederico VagaDocumentazione
349fdf0345eSFederico Vaga--------------
350fdf0345eSFederico Vaga
351fdf0345eSFederico VagaLa documentazione è spesso stata più un'eccezione che una regola nello
352fdf0345eSFederico Vagasviluppo del kernel.  Nonostante questo, un'adeguata documentazione aiuterà
353fdf0345eSFederico Vagaa facilitare l'inserimento di nuovo codice nel kernel, rende la vita più
354fdf0345eSFederico Vagafacile per gli altri sviluppatori e sarà utile per i vostri utenti.  In molti
355fdf0345eSFederico Vagacasi, la documentazione è divenuta sostanzialmente obbligatoria.
356fdf0345eSFederico Vaga
357fdf0345eSFederico VagaLa prima parte di documentazione per qualsiasi patch è il suo changelog.
358fdf0345eSFederico VagaQuesti dovrebbero descrivere le problematiche risolte, la tipologia di
359fdf0345eSFederico Vagasoluzione, le persone che lavorano alla patch, ogni effetto rilevante
360fdf0345eSFederico Vagasulle prestazioni e tutto ciò che può servire per la comprensione della
361fdf0345eSFederico Vagapatch.  Assicuratevi che il changelog dica *perché*, vale la pena aggiungere
362fdf0345eSFederico Vagala patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale
363fdf0345eSFederico Vagainformazione.
364fdf0345eSFederico Vaga
365fdf0345eSFederico VagaQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi
366fdf0345eSFederico Vaganuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale
367fdf0345eSFederico Vagainterfaccia così da permette agli sviluppatori dello spazio utente di sapere
368fdf0345eSFederico Vagacon cosa stanno lavorando.  Consultate: Documentation/ABI/README per avere una
369fdf0345eSFederico Vagadescrizione di come questi documenti devono essere impostati e quali
370fdf0345eSFederico Vagainformazioni devono essere fornite.
371fdf0345eSFederico Vaga
372fdf0345eSFederico VagaIl file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>`
373fdf0345eSFederico Vagadescrive tutti i parametri di avvio del kernel.  Ogni patch che aggiunga
374fdf0345eSFederico Vaganuovi parametri dovrebbe aggiungere nuove voci a questo file.
375fdf0345eSFederico Vaga
376fdf0345eSFederico VagaOgni nuova configurazione deve essere accompagnata da un testo di supporto
377fdf0345eSFederico Vagache spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle
378fdf0345eSFederico Vagaselezionare.
379fdf0345eSFederico Vaga
380fdf0345eSFederico VagaPer molti sottosistemi le informazioni sull'API interna sono documentate sotto
381fdf0345eSFederico Vagaforma di commenti formattati in maniera particolare; questi commenti possono
382fdf0345eSFederico Vagaessere estratti e formattati in differenti modi attraverso lo script
383fdf0345eSFederico Vaga"kernel-doc".  Se state lavorando all'interno di un sottosistema che ha
384fdf0345eSFederico Vagacommenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata,
385fdf0345eSFederico Vagaper le funzioni disponibili esternamente.  Anche in aree che non sono molto
386fdf0345eSFederico Vagadocumentate, non c'è motivo per non aggiungere commenti kerneldoc per il
387fdf0345eSFederico Vagafuturo; infatti, questa può essere un'attività utile per sviluppatori novizi
388fdf0345eSFederico Vagadel kernel.  Il formato di questi commenti, assieme alle informazione su come
389fdf0345eSFederico Vagacreare modelli per kerneldoc, possono essere trovati in
390fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`.
391fdf0345eSFederico Vaga
392fdf0345eSFederico VagaChiunque legga un ammontare significativo di codice kernel noterà che, spesso,
393fdf0345eSFederico Vagai commenti si fanno maggiormente notare per la loro assenza.  Ancora una volta,
394fdf0345eSFederico Vagale aspettative verso il nuovo codice sono più alte rispetto al passato;
395fdf0345eSFederico Vagainserire codice privo di commenti sarà più difficile.  Detto ciò, va aggiunto
396fdf0345eSFederico Vagache non si desiderano commenti prolissi per il codice.  Il codice dovrebbe
397fdf0345eSFederico Vagaessere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più
398fdf0345eSFederico Vagasottili.
399fdf0345eSFederico Vaga
400fdf0345eSFederico VagaDeterminate cose dovrebbero essere sempre commentate.  L'uso di barriere
401fdf0345eSFederico Vagadi memoria dovrebbero essere accompagnate da una riga che spieghi perché sia
402fdf0345eSFederico Vaganecessaria.  Le regole di sincronizzazione per le strutture dati, generalmente,
403fdf0345eSFederico Vaganecessitano di una spiegazioni da qualche parte.  Le strutture dati più
404fdf0345eSFederico Vagaimportanti, in generale, hanno bisogno di una documentazione onnicomprensiva.
405fdf0345eSFederico VagaLe dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere
406fdf0345eSFederico Vagaindicate.  Tutto ciò che potrebbe indurre un inserviente del codice a fare
407fdf0345eSFederico Vagauna "pulizia" incorretta, ha bisogno di un commento che dica perché è stato
408fdf0345eSFederico Vagafatto in quel modo.  E così via.
409fdf0345eSFederico Vaga
410fdf0345eSFederico VagaCambiamenti interni dell'API
411fdf0345eSFederico Vaga----------------------------
412fdf0345eSFederico Vaga
413fdf0345eSFederico VagaL'interfaccia binaria fornita dal kernel allo spazio utente non può essere
414fdf0345eSFederico Vagarotta tranne che in circostanze eccezionali.  L'interfaccia di programmazione
415fdf0345eSFederico Vagainterna al kernel, invece, è estremamente fluida e può essere modificata al
416fdf0345eSFederico Vagabisogno.  Se vi trovate a dover lavorare attorno ad un'API del kernel o
417fdf0345eSFederico Vagasemplicemente non state utilizzando una funzionalità offerta perché questa
418fdf0345eSFederico Vaganon rispecchia i vostri bisogni, allora questo potrebbe essere un segno che
419fdf0345eSFederico Vagal'API ha bisogno di essere cambiata.  In qualità di sviluppatore del kernel,
420fdf0345eSFederico Vagahai il potere di fare questo tipo di modifica.
421fdf0345eSFederico Vaga
422fdf0345eSFederico VagaCi sono ovviamente alcuni punti da cogliere.  I cambiamenti API possono essere
423fdf0345eSFederico Vagafatti, ma devono essere giustificati.  Quindi ogni patch che porta ad una
424fdf0345eSFederico Vagamodifica dell'API interna dovrebbe essere accompagnata da una descrizione
425fdf0345eSFederico Vagadella modifica in sé e del perché essa è necessaria.  Questo tipo di
426fdf0345eSFederico Vagacambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di
427fdf0345eSFederico Vagaessere sepolti all'interno di una patch più grande.
428fdf0345eSFederico Vaga
429fdf0345eSFederico VagaL'altro punto da cogliere consiste nel fatto che uno sviluppatore che
430fdf0345eSFederico Vagamodifica l'API deve, in generale, essere responsabile della correzione
431fdf0345eSFederico Vagadi tutto il codice del kernel che viene rotto per via della sua modifica.
432fdf0345eSFederico VagaPer una funzione ampiamente usata, questo compito può condurre letteralmente
433fdf0345eSFederico Vagaa centinaia o migliaia di modifiche, molte delle quali sono in conflitto con
434fdf0345eSFederico Vagail lavoro svolto da altri sviluppatori.  Non c'è bisogno di dire che questo
435fdf0345eSFederico Vagapuò essere un lavoro molto grosso, quindi è meglio essere sicuri che la
436fdf0345eSFederico Vagamotivazione sia ben solida.  Notate che lo strumento Coccinelle può fornire
437fdf0345eSFederico Vagaun aiuto con modifiche estese dell'API.
438fdf0345eSFederico Vaga
439fdf0345eSFederico VagaQuando viene fatta una modifica API incompatibile, una persona dovrebbe,
440fdf0345eSFederico Vagaquando possibile, assicurarsi che quel codice non aggiornato sia trovato
441fdf0345eSFederico Vagadal compilatore.  Questo vi aiuterà ad essere sicuri d'avere trovato,
442fdf0345eSFederico Vagatutti gli usi di quell'interfaccia.  Inoltre questo avviserà gli sviluppatori
443fdf0345eSFederico Vagadi codice fuori dal kernel che c'è un cambiamento per il quale è necessario del
444fdf0345eSFederico Vagalavoro.  Il supporto al codice fuori dal kernel non è qualcosa di cui gli
445fdf0345eSFederico Vagasviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere
446fdf0345eSFederico Vagapiù difficile del necessario la vita agli sviluppatori di questo codice.
447