€•Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/zh_CN/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/zh_TW/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/pt_BR/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/sp_SP/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒItalian”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒS/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/deprecated.rst”h´KubhŒwarning”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”hŒ paragraph”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”(hŒ·In caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le ”…””}”(hhÐh²hh³Nh´Nubh)”}”(hŒ!:ref:`avvertenze `”h]”hŒinline”“”)”}”(hhÚh]”hŒ avvertenze”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hÜhhØubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ%translations/it_IT/process/deprecated”Œ refdomain”héŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ it_disclaimer”uh1hh³Œ3Documentation/translations/it_IT/disclaimer-ita.rst”h´KhhÐubhŒ.”…””}”(hhÐh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hýh´KhhÊubah}”(h]”h ]”h"]”h$]”h&]”uh1hÈhhh²hh³hýh´NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjh³hÇh´KubhŒ field_body”“”)”}”(hŒ8:ref:`Documentation/process/deprecated.rst `”h]”hÏ)”}”(hj,h]”h)”}”(hj,h]”hÝ)”}”(hj,h]”hŒ$Documentation/process/deprecated.rst”…””}”(hj4h²hh³Nh´Nubah}”(h]”h ]”(hèŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hÜhj1ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hõŒ refdomain”j>Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhûŒ deprecated”uh1hh³hÇh´Khj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Khj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j(hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khjh²hubj)”}”(hhh]”(j)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjbh³hÇh´Kubj))”}”(hŒ)Federico Vaga ”h]”hÏ)”}”(hŒ(Federico Vaga ”h]”(hŒFederico Vaga <”…””}”(hjwh²hh³Nh´NubhŒ reference”“”)”}”(hŒfederico.vaga@vaga.pv.it”h]”hŒfederico.vaga@vaga.pv.it”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:federico.vaga@vaga.pv.it”uh1jhjwubhŒ>”…””}”(hjwh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Khjsubah}”(h]”h ]”h"]”h$]”h&]”uh1j(hjbubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khjh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhhh²hh³hÇh´KubhŒtarget”“”)”}”(hŒ.. _it_deprecated:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œ it-deprecated”uh1j­h´Khhh²hh³hÇubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒNInterfacce deprecate, caratteristiche del linguaggio, attributi, e convenzioni”h]”hŒNInterfacce deprecate, caratteristiche del linguaggio, attributi, e convenzioni”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj½h²hh³hÇh´K ubhÏ)”}”(hXúIn un mondo perfetto, sarebbe possibile prendere tutti gli usi di un'interfaccia deprecata e convertirli in quella nuova, e così sarebbe possibile rimuovere la vecchia interfaccia in un singolo ciclo di sviluppo. Tuttavia, per via delle dimensioni del kernel, la gerarchia dei manutentori e le tempistiche, non è sempre possibile fare questo tipo di conversione tutta in una volta. Questo significa che nuove istanze di una vecchia interfaccia potrebbero aggiungersi al kernel proprio quando si sta cercando di rimuoverle, aumentando così il carico di lavoro. Al fine di istruire gli sviluppatori su cosa è considerato deprecato (e perché), è stata create la seguente lista a cui fare riferimento quando qualcuno propone modifiche che usano cose deprecate.”h]”hXüIn un mondo perfetto, sarebbe possibile prendere tutti gli usi di un’interfaccia deprecata e convertirli in quella nuova, e così sarebbe possibile rimuovere la vecchia interfaccia in un singolo ciclo di sviluppo. Tuttavia, per via delle dimensioni del kernel, la gerarchia dei manutentori e le tempistiche, non è sempre possibile fare questo tipo di conversione tutta in una volta. Questo significa che nuove istanze di una vecchia interfaccia potrebbero aggiungersi al kernel proprio quando si sta cercando di rimuoverle, aumentando così il carico di lavoro. Al fine di istruire gli sviluppatori su cosa è considerato deprecato (e perché), è stata create la seguente lista a cui fare riferimento quando qualcuno propone modifiche che usano cose deprecate.”…””}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Khj½h²hubj¼)”}”(hhh]”(jÁ)”}”(hŒ __deprecated”h]”hŒ __deprecated”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjÞh²hh³hÇh´KubhÏ)”}”(hX[Nonostante questo attributo marchi visibilmente un interfaccia come deprecata, `non produce più alcun avviso durante la compilazione `_ perché uno degli obiettivi del kernel è quello di compilare senza avvisi; inoltre, nessuno stava agendo per rimuovere queste interfacce. Nonostante l'uso di `__deprecated` in un file d'intestazione sia opportuno per segnare una interfaccia come 'vecchia', questa non è una soluzione completa. L'interfaccia deve essere rimossa dal kernel, o aggiunta a questo documento per scoraggiarne l'uso.”h]”(hŒONonostante questo attributo marchi visibilmente un interfaccia come deprecata, ”…””}”(hjïh²hh³Nh´Nubj€)”}”(hŒ€`non produce più alcun avviso durante la compilazione `_”h]”hŒ5non produce più alcun avviso durante la compilazione”…””}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ5non produce più alcun avviso durante la compilazione”Œrefuri”ŒEhttps://git.kernel.org/linus/771c035372a036f83353eef46dbb829780330234”uh1jhjïubj®)”}”(hŒH ”h]”h}”(h]”Œ4non-produce-piu-alcun-avviso-durante-la-compilazione”ah ]”h"]”Œ5non produce più alcun avviso durante la compilazione”ah$]”h&]”Œrefuri”juh1j­Œ referenced”KhjïubhŒ¢ perché uno degli obiettivi del kernel è quello di compilare senza avvisi; inoltre, nessuno stava agendo per rimuovere queste interfacce. Nonostante l’uso di ”…””}”(hjïh²hh³Nh´NubhŒtitle_reference”“”)”}”(hŒ`__deprecated`”h]”hŒ __deprecated”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjïubhŒè in un file d’intestazione sia opportuno per segnare una interfaccia come ‘vecchia’, questa non è una soluzione completa. L’interfaccia deve essere rimossa dal kernel, o aggiunta a questo documento per scoraggiarne l’uso.”…””}”(hjïh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KhjÞh²hubeh}”(h]”Œ deprecated”ah ]”h"]”Œ __deprecated”ah$]”h&]”uh1j»hj½h²hh³hÇh´Kubj¼)”}”(hhh]”(jÁ)”}”(hŒBUG() e BUG_ON()”h]”hŒBUG() e BUG_ON()”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj=h²hh³hÇh´K&ubhÏ)”}”(hX_Al loro posto usate WARN() e WARN_ON() per gestire le condizioni "impossibili" e gestitele come se fosse possibile farlo. Nonostante le funzioni della famiglia BUG() siano state progettate per asserire "situazioni impossibili" e interrompere in sicurezza un thread del kernel, queste si sono rivelate essere troppo rischiose (per esempio, in quale ordine rilasciare i *lock*? Ci sono stati che sono stati ripristinati?). Molto spesso l'uso di BUG() destabilizza il sistema o lo corrompe del tutto, il che rende impossibile un'attività di debug o anche solo leggere un rapporto circa l'errore. Linus ha un'opinione molto critica al riguardo: `email 1 `_, `email 2 `_”h]”(hXxAl loro posto usate WARN() e WARN_ON() per gestire le condizioni “impossibili†e gestitele come se fosse possibile farlo. Nonostante le funzioni della famiglia BUG() siano state progettate per asserire “situazioni impossibili†e interrompere in sicurezza un thread del kernel, queste si sono rivelate essere troppo rischiose (per esempio, in quale ordine rilasciare i ”…””}”(hjNh²hh³Nh´NubhŒemphasis”“”)”}”(hŒ*lock*”h]”hŒlock”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jVhjNubhX? Ci sono stati che sono stati ripristinati?). Molto spesso l’uso di BUG() destabilizza il sistema o lo corrompe del tutto, il che rende impossibile un’attività di debug o anche solo leggere un rapporto circa l’errore. Linus ha un’opinione molto critica al riguardo: ”…””}”(hjNh²hh³Nh´Nubj€)”}”(hŒm`email 1 `_”h]”hŒemail 1”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œemail 1”jŒ`https://lore.kernel.org/lkml/CA+55aFy6jNLsywVYdGp83AMrXBo_P-pkjkphPGrO=82SPKCpLQ@mail.gmail.com/”uh1jhjNubj®)”}”(hŒc ”h]”h}”(h]”Œemail-1”ah ]”h"]”Œemail 1”ah$]”h&]”Œrefuri”jzuh1j­jKhjNubhŒ, ”…””}”(hjNh²hh³Nh´Nubj€)”}”(hŒm`email 2 `_”h]”hŒemail 2”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œemail 2”jŒ`https://lore.kernel.org/lkml/CAHk-=whDHsbK3HTOpTF=ue_o04onRwTEaK_ZoJp_fjbqq4+=Jw@mail.gmail.com/”uh1jhjNubj®)”}”(hŒc ”h]”h}”(h]”Œemail-2”ah ]”h"]”Œemail 2”ah$]”h&]”Œrefuri”jœuh1j­jKhjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K'hj=h²hubhÏ)”}”(hX?Tenete presente che la famiglia di funzioni WARN() dovrebbe essere usato solo per situazioni che si suppone siano "impossibili". Se volete avvisare gli utenti riguardo a qualcosa di possibile anche se indesiderato, usare le funzioni della famiglia pr_warn(). Chi amministra il sistema potrebbe aver attivato l'opzione sysctl *panic_on_warn* per essere sicuri che il sistema smetta di funzionare in caso si verifichino delle condizioni "inaspettate". (per esempio, date un'occhiata al questo `commit `_)”h]”(hXMTenete presente che la famiglia di funzioni WARN() dovrebbe essere usato solo per situazioni che si suppone siano “impossibiliâ€. Se volete avvisare gli utenti riguardo a qualcosa di possibile anche se indesiderato, usare le funzioni della famiglia pr_warn(). Chi amministra il sistema potrebbe aver attivato l’opzione sysctl ”…””}”(hj°h²hh³Nh´NubjW)”}”(hŒ*panic_on_warn*”h]”hŒ panic_on_warn”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jVhj°ubhŒ per essere sicuri che il sistema smetta di funzionare in caso si verifichino delle condizioni “inaspettateâ€. (per esempio, date un’occhiata al questo ”…””}”(hj°h²hh³Nh´Nubj€)”}”(hŒQ`commit `_”h]”hŒcommit”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œcommit”jŒEhttps://git.kernel.org/linus/d4689846881d160a4d12a514e991a740bcb5d65a”uh1jhj°ubj®)”}”(hŒH ”h]”h}”(h]”Œcommit”ah ]”h"]”Œcommit”ah$]”h&]”Œrefuri”jÚuh1j­jKhj°ubhŒ)”…””}”(hj°h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K6hj=h²hubeh}”(h]”Œ bug-e-bug-on”ah ]”h"]”Œbug() e bug_on()”ah$]”h&]”uh1j»hj½h²hh³hÇh´K&ubj¼)”}”(hhh]”(jÁ)”}”(hŒ3Calcoli codificati negli argomenti di un allocatore”h]”hŒ3Calcoli codificati negli argomenti di un allocatore”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjúh²hh³hÇh´KAubhÏ)”}”(hXVIl calcolo dinamico delle dimensioni (specialmente le moltiplicazioni) non dovrebbero essere fatto negli argomenti di funzioni di allocazione di memoria (o simili) per via del rischio di overflow. Questo può portare a valori più piccoli di quelli che il chiamante si aspettava. L'uso di questo modo di allocare può portare ad un overflow della memoria di heap e altri malfunzionamenti. (Si fa eccezione per valori numerici per i quali il compilatore può generare avvisi circa un potenziale overflow. Tuttavia, anche in questi casi è preferibile riscrivere il codice come suggerito di seguito).”h]”hXXIl calcolo dinamico delle dimensioni (specialmente le moltiplicazioni) non dovrebbero essere fatto negli argomenti di funzioni di allocazione di memoria (o simili) per via del rischio di overflow. Questo può portare a valori più piccoli di quelli che il chiamante si aspettava. L’uso di questo modo di allocare può portare ad un overflow della memoria di heap e altri malfunzionamenti. (Si fa eccezione per valori numerici per i quali il compilatore può generare avvisi circa un potenziale overflow. Tuttavia, anche in questi casi è preferibile riscrivere il codice come suggerito di seguito).”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KBhjúh²hubhÏ)”}”(hŒ8Per esempio, non usate ``count * size`` come argomento::”h]”(hŒPer esempio, non usate ”…””}”(hjh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``count * size``”h]”hŒ count * size”…””}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!hjubhŒ come argomento:”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KKhjúh²hubhŒ literal_block”“”)”}”(hŒ(foo = kmalloc(count * size, GFP_KERNEL);”h]”hŒ(foo = kmalloc(count * size, GFP_KERNEL);”…””}”hj=sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´KMhjúh²hubhÏ)”}”(hŒ>Al suo posto, si dovrebbe usare l'allocatore a due argomenti::”h]”hŒ?Al suo posto, si dovrebbe usare l’allocatore a due argomenti:”…””}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KOhjúh²hubj<)”}”(hŒ-foo = kmalloc_array(count, size, GFP_KERNEL);”h]”hŒ-foo = kmalloc_array(count, size, GFP_KERNEL);”…””}”hjYsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´KQhjúh²hubhÏ)”}”(hŒ^Nello specifico, kmalloc() può essere sostituta da kmalloc_array(), e kzalloc() da kcalloc().”h]”hŒ^Nello specifico, kmalloc() può essere sostituta da kmalloc_array(), e kzalloc() da kcalloc().”…””}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KShjúh²hubhÏ)”}”(hŒ}Se questo tipo di allocatore non è disponibile, allora dovrebbero essere usate le funzioni del tipo *saturate-on-overflow*::”h]”(hŒeSe questo tipo di allocatore non è disponibile, allora dovrebbero essere usate le funzioni del tipo ”…””}”(hjuh²hh³Nh´NubjW)”}”(hŒ*saturate-on-overflow*”h]”hŒsaturate-on-overflow”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jVhjuubhŒ:”…””}”(hjuh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KVhjúh²hubj<)”}”(hŒIbar = dma_alloc_coherent(dev, array_size(count, size), &dma, GFP_KERNEL);”h]”hŒIbar = dma_alloc_coherent(dev, array_size(count, size), &dma, GFP_KERNEL);”…””}”hj•sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´KYhjúh²hubhÏ)”}”(hŒ˜Un altro tipico caso da evitare è quello di calcolare la dimensione di una struttura seguita da un vettore di altre strutture, come nel seguente caso::”h]”hŒ—Un altro tipico caso da evitare è quello di calcolare la dimensione di una struttura seguita da un vettore di altre strutture, come nel seguente caso:”…””}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K[hjúh²hubj<)”}”(hŒ_header = kzalloc(sizeof(*header) + count * sizeof(*header->item), GFP_KERNEL);”h]”hŒ_header = kzalloc(sizeof(*header) + count * sizeof(*header->item), GFP_KERNEL);”…””}”hj±sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´K^hjúh²hubhÏ)”}”(hŒ$Invece, usate la seguente funzione::”h]”hŒ#Invece, usate la seguente funzione:”…””}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Kahjúh²hubj<)”}”(hŒ?header = kzalloc(struct_size(header, item, count), GFP_KERNEL);”h]”hŒ?header = kzalloc(struct_size(header, item, count), GFP_KERNEL);”…””}”hjÍsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´Kchjúh²hubhŒnote”“”)”}”(hŒôSe per caso state usando struct_size() su una struttura dati che in coda contiene un array di lunghezza zero o uno, allora siete invitati a riorganizzare il vostro codice usando il `flexible array member <#zero-length-and-one-element-arrays>`_.”h]”hÏ)”}”(hŒôSe per caso state usando struct_size() su una struttura dati che in coda contiene un array di lunghezza zero o uno, allora siete invitati a riorganizzare il vostro codice usando il `flexible array member <#zero-length-and-one-element-arrays>`_.”h]”(hŒµSe per caso state usando struct_size() su una struttura dati che in coda contiene un array di lunghezza zero o uno, allora siete invitati a riorganizzare il vostro codice usando il ”…””}”(hjáh²hh³Nh´Nubj€)”}”(hŒ>`flexible array member <#zero-length-and-one-element-arrays>`_”h]”hŒflexible array member”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œflexible array member”jŒ##zero-length-and-one-element-arrays”uh1jhjáubj®)”}”(hŒ& <#zero-length-and-one-element-arrays>”h]”h}”(h]”Œflexible-array-member”ah ]”h"]”Œflexible array member”ah$]”h&]”Œrefuri”jùuh1j­jKhjáubhŒ.”…””}”(hjáh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KehjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jÛhjúh²hh³hÇh´NubhÏ)”}”(hŒePer altri calcoli, usate le funzioni size_mul(), size_add(), e size_sub(). Per esempio, al posto di::”h]”hŒdPer altri calcoli, usate le funzioni size_mul(), size_add(), e size_sub(). Per esempio, al posto di:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Kjhjúh²hubj<)”}”(hŒDfoo = krealloc(current_size + chunk_size * (count - 3), GFP_KERNEL);”h]”hŒDfoo = krealloc(current_size + chunk_size * (count - 3), GFP_KERNEL);”…””}”hj%sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´Kmhjúh²hubhÏ)”}”(hŒdovreste scrivere:”h]”hŒdovreste scrivere:”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Kohjúh²hubhŒ block_quote”“”)”}”(hŒ—foo = krealloc(size_add(current_size, size_mul(chunk_size, size_sub(count, 3))), GFP_KERNEL); ”h]”hŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hŒgfoo = krealloc(size_add(current_size, size_mul(chunk_size, size_sub(count, 3))), GFP_KERNEL); ”h]”(hŒterm”“”)”}”(hŒ%foo = krealloc(size_add(current_size,”h]”hŒ%foo = krealloc(size_add(current_size,”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³hÇh´KshjNubhŒ definition”“”)”}”(hhh]”jH)”}”(hhh]”jM)”}”(hŒ8size_mul(chunk_size, size_sub(count, 3))), GFP_KERNEL); ”h]”(jS)”}”(hŒsize_mul(chunk_size,”h]”hŒsize_mul(chunk_size,”…””}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³hÇh´Kshjjubjc)”}”(hhh]”hÏ)”}”(hŒ"size_sub(count, 3))), GFP_KERNEL);”h]”hŒ"size_sub(count, 3))), GFP_KERNEL);”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Kshj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´Kshjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jGhjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³hÇh´KshjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jGhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jAh³hÇh´Kqhjúh²hubhÏ)”}”(hŒÉPer maggiori dettagli fate riferimento a array3_size() e flex_array_size(), ma anche le funzioni della famiglia check_mul_overflow(), check_add_overflow(), check_sub_overflow(), e check_shl_overflow().”h]”hŒÉPer maggiori dettagli fate riferimento a array3_size() e flex_array_size(), ma anche le funzioni della famiglia check_mul_overflow(), check_add_overflow(), check_sub_overflow(), e check_shl_overflow().”…””}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Kuhjúh²hubeh}”(h]”Œ3calcoli-codificati-negli-argomenti-di-un-allocatore”ah ]”h"]”Œ3calcoli codificati negli argomenti di un allocatore”ah$]”h&]”uh1j»hj½h²hh³hÇh´KAubj¼)”}”(hhh]”(jÁ)”}”(hŒFsimple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull()”h]”hŒFsimple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull()”…””}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjÍh²hh³hÇh´KzubhÏ)”}”(hX«Le funzioni simple_strtol(), simple_strtoll(), simple_strtoul(), e simple_strtoull() ignorano volutamente i possibili overflow, e questo può portare il chiamante a generare risultati inaspettati. Le rispettive funzioni kstrtol(), kstrtoll(), kstrtoul(), e kstrtoull() sono da considerarsi le corrette sostitute; tuttavia va notato che queste richiedono che la stringa sia terminata con il carattere NUL o quello di nuova riga.”h]”hX«Le funzioni simple_strtol(), simple_strtoll(), simple_strtoul(), e simple_strtoull() ignorano volutamente i possibili overflow, e questo può portare il chiamante a generare risultati inaspettati. Le rispettive funzioni kstrtol(), kstrtoll(), kstrtoul(), e kstrtoull() sono da considerarsi le corrette sostitute; tuttavia va notato che queste richiedono che la stringa sia terminata con il carattere NUL o quello di nuova riga.”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K{hjÍh²hubeh}”(h]”Œ;simple-strtol-simple-strtoll-simple-strtoul-simple-strtoull”ah ]”h"]”ŒFsimple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull()”ah$]”h&]”uh1j»hj½h²hh³hÇh´Kzubj¼)”}”(hhh]”(jÁ)”}”(hŒstrcpy()”h]”hŒstrcpy()”…””}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjôh²hh³hÇh´K„ubhÏ)”}”(hX§La funzione strcpy() non fa controlli agli estremi del buffer di destinazione. Questo può portare ad un overflow oltre i limiti del buffer e generare svariati tipi di malfunzionamenti. Nonostante l'opzione `CONFIG_FORTIFY_SOURCE=y` e svariate opzioni del compilatore aiutano a ridurne il rischio, non c'è alcuna buona ragione per continuare ad usare questa funzione. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strcpy(). La funzione strscpy() non ritorna un puntatore alla destinazione, ma un contatore dei byte non NUL copiati (oppure un errno negativo se la stringa è stata troncata).”h]”(hŒÑLa funzione strcpy() non fa controlli agli estremi del buffer di destinazione. Questo può portare ad un overflow oltre i limiti del buffer e generare svariati tipi di malfunzionamenti. Nonostante l’opzione ”…””}”(hjh²hh³Nh´Nubj)”}”(hŒ`CONFIG_FORTIFY_SOURCE=y`”h]”hŒCONFIG_FORTIFY_SOURCE=y”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhXÁ e svariate opzioni del compilatore aiutano a ridurne il rischio, non c’è alcuna buona ragione per continuare ad usare questa funzione. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strcpy(). La funzione strscpy() non ritorna un puntatore alla destinazione, ma un contatore dei byte non NUL copiati (oppure un errno negativo se la stringa è stata troncata).”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K…hjôh²hubeh}”(h]”Œstrcpy”ah ]”h"]”Œstrcpy()”ah$]”h&]”uh1j»hj½h²hh³hÇh´K„ubj¼)”}”(hhh]”(jÁ)”}”(hŒ&strncpy() su stringe terminate con NUL”h]”hŒ&strncpy() su stringe terminate con NUL”…””}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj-h²hh³hÇh´K‘ubhÏ)”}”(hXgL'utilizzo di strncpy() non fornisce alcuna garanzia sul fatto che il buffer di destinazione verrà terminato con il carattere NUL. Questo potrebbe portare a diversi overflow di lettura o altri malfunzionamenti causati, appunto, dalla mancanza del terminatore. Questa estende la terminazione nel buffer di destinazione quando la stringa d'origine è più corta; questo potrebbe portare ad una penalizzazione delle prestazioni per chi usa solo stringe terminate. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strncpy(). La funzione strscpy() non ritorna un puntatore alla destinazione, ma un contatore dei byte non NUL copiati (oppure un errno negativo se la stringa è stata troncata). Tutti i casi che necessitano di estendere la terminazione con NUL dovrebbero usare strscpy_pad().”h]”hXkL’utilizzo di strncpy() non fornisce alcuna garanzia sul fatto che il buffer di destinazione verrà terminato con il carattere NUL. Questo potrebbe portare a diversi overflow di lettura o altri malfunzionamenti causati, appunto, dalla mancanza del terminatore. Questa estende la terminazione nel buffer di destinazione quando la stringa d’origine è più corta; questo potrebbe portare ad una penalizzazione delle prestazioni per chi usa solo stringe terminate. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strncpy(). La funzione strscpy() non ritorna un puntatore alla destinazione, ma un contatore dei byte non NUL copiati (oppure un errno negativo se la stringa è stata troncata). Tutti i casi che necessitano di estendere la terminazione con NUL dovrebbero usare strscpy_pad().”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K’hj-h²hubhÏ)”}”(hX'Se il chiamate no usa stringhe terminate con NUL, allore strncpy() può continuare ad essere usata, ma i buffer di destinazione devono essere marchiati con l'attributo `__nonstring `_ per evitare avvisi durante la compilazione.”h]”(hŒªSe il chiamate no usa stringhe terminate con NUL, allore strncpy() può continuare ad essere usata, ma i buffer di destinazione devono essere marchiati con l’attributo ”…””}”(hjLh²hh³Nh´Nubj€)”}”(hŒS`__nonstring `_”h]”hŒ __nonstring”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ __nonstring”jŒBhttps://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html”uh1jhjLubj®)”}”(hŒE ”h]”h}”(h]”Œ nonstring”ah ]”h"]”Œ __nonstring”ah$]”h&]”Œrefuri”jduh1j­jKhjLubhŒ, per evitare avvisi durante la compilazione.”…””}”(hjLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K hj-h²hubeh}”(h]”Œ$strncpy-su-stringe-terminate-con-nul”ah ]”h"]”Œ&strncpy() su stringe terminate con nul”ah$]”h&]”uh1j»hj½h²hh³hÇh´K‘ubj¼)”}”(hhh]”(jÁ)”}”(hŒ strlcpy()”h]”hŒ strlcpy()”…””}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj„h²hh³hÇh´K¦ubhÏ)”}”(hXÝLa funzione strlcpy(), per prima cosa, legge interamente il buffer di origine, magari leggendo più di quanto verrà effettivamente copiato. Questo è inefficiente e può portare a overflow di lettura quando la stringa non è terminata con NUL. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strlcpy(), dato che strscpy() ritorna un valore di errno negativo quanto la stringa viene troncata.”h]”hXÝLa funzione strlcpy(), per prima cosa, legge interamente il buffer di origine, magari leggendo più di quanto verrà effettivamente copiato. Questo è inefficiente e può portare a overflow di lettura quando la stringa non è terminata con NUL. La versione sicura da usare è strscpy(), tuttavia va prestata attenzione a tutti quei casi dove viene usato il valore di ritorno di strlcpy(), dato che strscpy() ritorna un valore di errno negativo quanto la stringa viene troncata.”…””}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K§hj„h²hubeh}”(h]”Œstrlcpy”ah ]”h"]”Œ strlcpy()”ah$]”h&]”uh1j»hj½h²hh³hÇh´K¦ubj¼)”}”(hhh]”(jÁ)”}”(hŒ&Segnaposto %p nella stringa di formato”h]”hŒ&Segnaposto %p nella stringa di formato”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhj«h²hh³hÇh´K°ubhÏ)”}”(hX#Tradizionalmente, l'uso del segnaposto "%p" nella stringa di formato esponne un indirizzo di memoria in dmesg, proc, sysfs, eccetera. Per evitare che questi indirizzi vengano sfruttati da malintenzionati, tutto gli usi di "%p" nel kernel rappresentano l'hash dell'indirizzo, rendendolo di fatto inutilizzabile. Nuovi usi di "%p" non dovrebbero essere aggiunti al kernel. Per una rappresentazione testuale di un indirizzo usate "%pS", l'output è migliore perché mostrerà il nome del simbolo. Per tutto il resto, semplicemente non usate "%p".”h]”hX?Tradizionalmente, l’uso del segnaposto “%p†nella stringa di formato esponne un indirizzo di memoria in dmesg, proc, sysfs, eccetera. Per evitare che questi indirizzi vengano sfruttati da malintenzionati, tutto gli usi di “%p†nel kernel rappresentano l’hash dell’indirizzo, rendendolo di fatto inutilizzabile. Nuovi usi di “%p†non dovrebbero essere aggiunti al kernel. Per una rappresentazione testuale di un indirizzo usate “%pSâ€, l’output è migliore perché mostrerà il nome del simbolo. Per tutto il resto, semplicemente non usate “%pâ€.”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K²hj«h²hubhÏ)”}”(hŒ…Parafrasando la `guida `_ di Linus:”h]”(hŒParafrasando la ”…””}”(hjÊh²hh³Nh´Nubj€)”}”(hŒk`guida `_”h]”hŒguida”…””}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œguida”jŒ`https://lore.kernel.org/lkml/CA+55aFwQEd_d40g4mUCSsVRZzrFPUJt74vc6PPpb675hYNXcKw@mail.gmail.com/”uh1jhjÊubj®)”}”(hŒc ”h]”h}”(h]”Œguida”ah ]”h"]”Œguida”ah$]”h&]”Œrefuri”jâuh1j­jKhjÊubhŒ di Linus:”…””}”(hjÊh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K»hj«h²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ}Se il valore hash di "%p" è inutile, chiediti se il puntatore stesso è importante. Forse dovrebbe essere rimosso del tutto?”h]”hÏ)”}”(hŒ}Se il valore hash di "%p" è inutile, chiediti se il puntatore stesso è importante. Forse dovrebbe essere rimosso del tutto?”h]”hŒSe il valore hash di “%p†è inutile, chiediti se il puntatore stesso è importante. Forse dovrebbe essere rimosso del tutto?”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´K¿hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÿhjüh²hh³hÇh´Nubj)”}”(hXrSe credi davvero che il vero valore del puntatore sia importante, perché alcuni stati del sistema o i livelli di privilegi di un utente sono considerati "special"? Se pensi di poterlo giustificare (in un commento e nel messaggio del commit) abbastanza bene da affrontare il giudizio di Linus, allora forse potrai usare "%px", assicurandosi anche di averne il permesso. ”h]”hÏ)”}”(hXqSe credi davvero che il vero valore del puntatore sia importante, perché alcuni stati del sistema o i livelli di privilegi di un utente sono considerati "special"? Se pensi di poterlo giustificare (in un commento e nel messaggio del commit) abbastanza bene da affrontare il giudizio di Linus, allora forse potrai usare "%px", assicurandosi anche di averne il permesso.”h]”hXySe credi davvero che il vero valore del puntatore sia importante, perché alcuni stati del sistema o i livelli di privilegi di un utente sono considerati “specialâ€? Se pensi di poterlo giustificare (in un commento e nel messaggio del commit) abbastanza bene da affrontare il giudizio di Linus, allora forse potrai usare “%pxâ€, assicurandosi anche di averne il permesso.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KÁhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÿhjüh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1júh³hÇh´K¿hj«h²hubhÏ)”}”(hX2Potete disabilitare temporaneamente l'hashing di "%p" nel caso in cui questa funzionalità vi sia d'ostacolo durante una sessione di debug. Per farlo aggiungete l'opzione di debug "`no_hash_pointers `_" alla riga di comando del kernel.”h]”(hŒÁPotete disabilitare temporaneamente l’hashing di “%p†nel caso in cui questa funzionalità vi sia d’ostacolo durante una sessione di debug. Per farlo aggiungete l’opzione di debug “”…””}”(hj9h²hh³Nh´Nubj€)”}”(hŒ[`no_hash_pointers `_”h]”hŒno_hash_pointers”…””}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œno_hash_pointers”jŒEhttps://git.kernel.org/linus/5ead723a20e0447bc7db33dc3070b420e5f80aa6”uh1jhj9ubj®)”}”(hŒH ”h]”h}”(h]”Œno-hash-pointers”ah ]”h"]”Œno_hash_pointers”ah$]”h&]”Œrefuri”jQuh1j­jKhj9ubhŒ$†alla riga di comando del kernel.”…””}”(hj9h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KÈhj«h²hubeh}”(h]”Œ%segnaposto-p-nella-stringa-di-formato”ah ]”h"]”Œ&segnaposto %p nella stringa di formato”ah$]”h&]”uh1j»hj½h²hh³hÇh´K°ubj¼)”}”(hhh]”(jÁ)”}”(hŒ$Vettori a dimensione variabile (VLA)”h]”hŒ$Vettori a dimensione variabile (VLA)”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjqh²hh³hÇh´KÏubhÏ)”}”(hXÂUsare VLA sullo stack produce codice molto peggiore rispetto a quando si usano vettori a dimensione fissa. Questi `problemi di prestazioni `_, tutt'altro che banali, sono già un motivo valido per eliminare i VLA; in aggiunta sono anche un problema per la sicurezza. La crescita dinamica di un vettore nello stack potrebbe eccedere la memoria rimanente in tale segmento. Questo può portare a dei malfunzionamenti, potrebbe sovrascrivere dati importanti alla fine dello stack (quando il kernel è compilato senza `CONFIG_THREAD_INFO_IN_TASK=y`), o sovrascrivere un pezzo di memoria adiacente allo stack (quando il kernel è compilato senza `CONFIG_VMAP_STACK=y`).”h]”(hŒrUsare VLA sullo stack produce codice molto peggiore rispetto a quando si usano vettori a dimensione fissa. Questi ”…””}”(hj‚h²hh³Nh´Nubj€)”}”(hŒF`problemi di prestazioni `_”h]”hŒproblemi di prestazioni”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œproblemi di prestazioni”jŒ)https://git.kernel.org/linus/02361bc77888”uh1jhj‚ubj®)”}”(hŒ, ”h]”h}”(h]”Œproblemi-di-prestazioni”ah ]”h"]”Œproblemi di prestazioni”ah$]”h&]”Œrefuri”jšuh1j­jKhj‚ubhXv, tutt’altro che banali, sono già un motivo valido per eliminare i VLA; in aggiunta sono anche un problema per la sicurezza. La crescita dinamica di un vettore nello stack potrebbe eccedere la memoria rimanente in tale segmento. Questo può portare a dei malfunzionamenti, potrebbe sovrascrivere dati importanti alla fine dello stack (quando il kernel è compilato senza ”…””}”(hj‚h²hh³Nh´Nubj)”}”(hŒ`CONFIG_THREAD_INFO_IN_TASK=y`”h]”hŒCONFIG_THREAD_INFO_IN_TASK=y”…””}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‚ubhŒa), o sovrascrivere un pezzo di memoria adiacente allo stack (quando il kernel è compilato senza ”…””}”(hj‚h²hh³Nh´Nubj)”}”(hŒ`CONFIG_VMAP_STACK=y`”h]”hŒCONFIG_VMAP_STACK=y”…””}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‚ubhŒ).”…””}”(hj‚h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KÑhjqh²hubeh}”(h]”Œ"vettori-a-dimensione-variabile-vla”ah ]”h"]”Œ$vettori a dimensione variabile (vla)”ah$]”h&]”uh1j»hj½h²hh³hÇh´KÏubj¼)”}”(hhh]”(jÁ)”}”(hŒ+Salto implicito nell'istruzione switch-case”h]”hŒ-Salto implicito nell’istruzione switch-case”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÀhjÞh²hh³hÇh´KÜubhÏ)”}”(hX»Il linguaggio C permette ai casi di un'istruzione `switch` di saltare al prossimo caso quando l'istruzione "break" viene omessa alla fine del caso corrente. Tuttavia questo rende il codice ambiguo perché non è sempre ovvio se l'istruzione "break" viene omessa intenzionalmente o è un baco. Per esempio, osservando il seguente pezzo di codice non è chiaro se lo stato `STATE_ONE` è stato progettato apposta per eseguire anche `STATE_TWO`::”h]”(hŒ4Il linguaggio C permette ai casi di un’istruzione ”…””}”(hjïh²hh³Nh´Nubj)”}”(hŒ`switch`”h]”hŒswitch”…””}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjïubhXE di saltare al prossimo caso quando l’istruzione “break†viene omessa alla fine del caso corrente. Tuttavia questo rende il codice ambiguo perché non è sempre ovvio se l’istruzione “break†viene omessa intenzionalmente o è un baco. Per esempio, osservando il seguente pezzo di codice non è chiaro se lo stato ”…””}”(hjïh²hh³Nh´Nubj)”}”(hŒ `STATE_ONE`”h]”hŒ STATE_ONE”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjïubhŒ0 è stato progettato apposta per eseguire anche ”…””}”(hjïh²hh³Nh´Nubj)”}”(hŒ `STATE_TWO`”h]”hŒ STATE_TWO”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjïubhŒ:”…””}”(hjïh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KÞhjÞh²hubj<)”}”(hŒ•switch (value) { case STATE_ONE: do_something(); case STATE_TWO: do_other(); break; default: WARN("unknown state"); }”h]”hŒ•switch (value) { case STATE_ONE: do_something(); case STATE_TWO: do_other(); break; default: WARN("unknown state"); }”…””}”hj3sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j;h³hÇh´KåhjÞh²hubhÏ)”}”(hX´Dato che c'è stata una lunga lista di problemi `dovuti alla mancanza dell'istruzione "break" `_, oggigiorno non permettiamo più che vi sia un "salto implicito" (*fall-through*). Per identificare un salto implicito intenzionale abbiamo adottato la pseudo parola chiave 'fallthrough' che viene espansa nell'estensione di gcc `__attribute__((fallthrough))` `Statement Attributes `_. (Quando la sintassi C17/C18 `[[fallthrough]]` sarà più comunemente supportata dai compilatori C, analizzatori statici, e dagli IDE, allora potremo usare quella sintassi per la pseudo parola chiave)”h]”(hŒ2Dato che c’è stata una lunga lista di problemi ”…””}”(hjAh²hh³Nh´Nubj€)”}”(hŒa`dovuti alla mancanza dell'istruzione "break" `_”h]”hŒ2dovuti alla mancanza dell’istruzione “break—…””}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ,dovuti alla mancanza dell'istruzione "break"”jŒ/https://cwe.mitre.org/data/definitions/484.html”uh1jhjAubj®)”}”(hŒ2 ”h]”h}”(h]”Œ*dovuti-alla-mancanza-dell-istruzione-break”ah ]”h"]”Œ,dovuti alla mancanza dell'istruzione "break"”ah$]”h&]”Œrefuri”jYuh1j­jKhjAubhŒG, oggigiorno non permettiamo più che vi sia un “salto implicito†(”…””}”(hjAh²hh³Nh´NubjW)”}”(hŒ*fall-through*”h]”hŒ fall-through”…””}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jVhjAubhŒš). Per identificare un salto implicito intenzionale abbiamo adottato la pseudo parola chiave ‘fallthrough’ che viene espansa nell’estensione di gcc ”…””}”(hjAh²hh³Nh´Nubj)”}”(hŒ`__attribute__((fallthrough))`”h]”hŒ__attribute__((fallthrough))”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjAubhŒ ”…””}”(hjAh²hh³Nh´Nubj€)”}”(hŒV`Statement Attributes `_”h]”hŒStatement Attributes”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒStatement Attributes”jŒ”h]”h}”(h]”Œstatement-attributes”ah ]”h"]”Œstatement attributes”ah$]”h&]”Œrefuri”jŸuh1j­jKhjAubhŒ. (Quando la sintassi C17/C18 ”…””}”(hjAh²hh³Nh´Nubj)”}”(hŒ`[[fallthrough]]`”h]”hŒ[[fallthrough]]”…””}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjAubhŒš sarà più comunemente supportata dai compilatori C, analizzatori statici, e dagli IDE, allora potremo usare quella sintassi per la pseudo parola chiave)”…””}”(hjAh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KïhjÞh²hubhÏ)”}”(hŒ¨Quando la sintassi [[fallthrough]] sarà più comunemente supportata dai compilatori, analizzatori statici, e ambienti di sviluppo IDE, allora potremo usarla anche noi.”h]”hŒ¨Quando la sintassi [[fallthrough]] sarà più comunemente supportata dai compilatori, analizzatori statici, e ambienti di sviluppo IDE, allora potremo usarla anche noi.”…””}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KúhjÞh²hubhÏ)”}”(hŒSNe consegue che tutti i blocchi switch/case devono finire in uno dei seguenti modi:”h]”hŒSNe consegue che tutti i blocchi switch/case devono finire in uno dei seguenti modi:”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´KþhjÞh²hubjû)”}”(hhh]”(j)”}”(hŒ ``break;``”h]”hÏ)”}”(hjêh]”j")”}”(hjêh]”hŒbreak;”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Mhjèubah}”(h]”h ]”h"]”h$]”h&]”uh1jÿhjåh²hh³hÇh´Nubj)”}”(hŒ`fallthrough;``”h]”hÏ)”}”(hj h]”j)”}”(hj h]”hŒ fallthrough;`”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÿhjåh²hh³hÇh´Nubj)”}”(hŒ ``continue;``”h]”hÏ)”}”(hj*h]”j")”}”(hj*h]”hŒ continue;”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j!hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÎh³hÇh´Mhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÿhjåh²hh³hÇh´Nubj)”}”(hŒ``goto