€•ZóŒ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ŒItalian”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/process/deprecated”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhnsbah}”(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”…””}”hh‚sbah}”(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 ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒSpanish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la Ćŗnica referencia vĆ”lida es la documentación oficial en inglĆ©s. AdemĆ”s, por defecto, los enlaces a documentos redirigen a la documentación en inglĆ©s, incluso si existe una versión traducida. Consulte el Ć­ndice para mĆ”s información.”h]”hŒ paragraph”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la Ćŗnica referencia vĆ”lida es la documentación oficial en inglĆ©s. AdemĆ”s, por defecto, los enlaces a documentos redirigen a la documentación en inglĆ©s, incluso si existe una versión traducida. Consulte el Ć­ndice para mĆ”s información.”h]”hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la Ćŗnica referencia vĆ”lida es la documentación oficial en inglĆ©s. AdemĆ”s, por defecto, los enlaces a documentos redirigen a la documentación en inglĆ©s, incluso si existe una versión traducida. Consulte el Ć­ndice para mĆ”s información.”…””}”(hh½h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³Œ2Documentation/translations/sp_SP/disclaimer-sp.rst”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”…””}”(hhŽh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhhŁh³ŒS/var/lib/git/docbuild/linux/Documentation/translations/sp_SP/process/deprecated.rst”h“KubhŒ field_body”“”)”}”(hŒ8:ref:`Documentation/process/deprecated.rst `”h]”h¼)”}”(hhńh]”h)”}”(hhńh]”hŒinline”“”)”}”(hhńh]”hŒ$Documentation/process/deprecated.rst”…””}”(hhūh²hh³Nh“Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hłhhöubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ%translations/sp_SP/process/deprecated”Œ refdomain”jŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ deprecated”uh1hh³hģh“Khhóubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khhļubah}”(h]”h ]”h"]”h$]”h&]”uh1hķhhŁubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hģh“KhhŌh²hubhŲ)”}”(hhh]”(hŻ)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hj/h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj,h³hģh“Kubhī)”}”(hŒ+Sergio Gonzalez ”h]”h¼)”}”(hŒ*Sergio Gonzalez ”h]”(hŒSergio Gonzalez <”…””}”(hjAh²hh³Nh“NubhŒ reference”“”)”}”(hŒsergio.collado@gmail.com”h]”hŒsergio.collado@gmail.com”…””}”(hjKh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:sergio.collado@gmail.com”uh1jIhjAubhŒ>”…””}”(hjAh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hķhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hģh“KhhŌh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hŅhhh²hh³hģh“KubhŒtarget”“”)”}”(hŒ.. _sp_deprecated:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œ sp-deprecated”uh1jwh“Khhh²hh³hģubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒMInterfaces obsoletos, CaracterĆ­sticas del lenguaje, Atributos y Convenciones”h]”hŒMInterfaces obsoletos, CaracterĆ­sticas del lenguaje, Atributos y Convenciones”…””}”(hjŒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hģh“K ubh¼)”}”(hXÅEn un mundo perfecto, serĆ­a posible convertir todas las instancias de alguna API obsoleta en una nueva API y quitar la API anterior en un Ćŗnico ciclo de desarrollo. Desafortunadamente, debido al tamaƱo del kernel, la jerarquĆ­a de mantenimiento, y el tiempo, no siempre es posible hacer estos cambios de una Ćŗnica vez. Esto significa que las nuevas instancias han de ir creĆ”ndose en el kernel, mientras que las antiguas se quitan, haciendo que la cantidad de trabajo para limpiar las APIs crezca. Para informar a los desarrolladores sobre quĆ© ha sido declarado obsoleto y por quĆ©, ha sido creada esta lista como un lugar donde indicar cuando los usos obsoletos son propuestos para incluir en el kernel.”h]”hXÅEn un mundo perfecto, serĆ­a posible convertir todas las instancias de alguna API obsoleta en una nueva API y quitar la API anterior en un Ćŗnico ciclo de desarrollo. Desafortunadamente, debido al tamaƱo del kernel, la jerarquĆ­a de mantenimiento, y el tiempo, no siempre es posible hacer estos cambios de una Ćŗnica vez. Esto significa que las nuevas instancias han de ir creĆ”ndose en el kernel, mientras que las antiguas se quitan, haciendo que la cantidad de trabajo para limpiar las APIs crezca. Para informar a los desarrolladores sobre quĆ© ha sido declarado obsoleto y por quĆ©, ha sido creada esta lista como un lugar donde indicar cuando los usos obsoletos son propuestos para incluir en el kernel.”…””}”(hjšh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K hj‡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¼)”}”(hXaMientras que este atributo seƱala visualmente que un interface ha sido declarado obsoleto, este `no produce mĆ”s avisos durante las compilaciones `_ porque uno de los objetivos del kernel es que compile sin avisos, y nadie ha hecho nada para quitar estos interfaces obsoletos. Mientras que usar `__deprecated` es sencillo para anotar una API obsoleta en un archivo de cabecera, no es la solución completa. Dichos interfaces deben o bien ser quitados por completo, o aƱadidos a este archivo para desanimar a otros a usarla en el futuro.”h]”(hŒaMientras que este atributo seƱala visualmente que un interface ha sido declarado obsoleto, este ”…””}”(hj¹h²hh³Nh“NubjJ)”}”(hŒ{`no produce mĆ”s avisos durante las compilaciones `_”h]”hŒ0no produce mĆ”s avisos durante las compilaciones”…””}”(hjĮh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ0no produce mĆ”s avisos durante las compilaciones”Œrefuri”ŒEhttps://git.kernel.org/linus/771c035372a036f83353eef46dbb829780330234”uh1jIhj¹ubjx)”}”(hŒH ”h]”h}”(h]”Œ/no-produce-mas-avisos-durante-las-compilaciones”ah ]”h"]”Œ0no produce mĆ”s avisos durante las compilaciones”ah$]”h&]”Œrefuri”jŅuh1jwŒ referenced”Khj¹ubhŒ“ porque uno de los objetivos del kernel es que compile sin avisos, y nadie ha hecho nada para quitar estos interfaces obsoletos. Mientras que usar ”…””}”(hj¹h²hh³Nh“NubhŒtitle_reference”“”)”}”(hŒ`__deprecated`”h]”hŒ __deprecated”…””}”(hjēh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj¹ubhŒä es sencillo para anotar una API obsoleta en un archivo de cabecera, no es la solución completa. Dichos interfaces deben o bien ser quitados por completo, o aƱadidos a este archivo para desanimar a otros a usarla en el futuro.”…””}”(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() y BUG_ON()”h]”hŒBUG() y BUG_ON()”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjh²hh³hģh“K$ubh¼)”}”(hX_Use WARN() y WARN_ON() en su lugar, y gestione las condiciones de error "imposibles" tan elegantemente como se pueda. Mientras que la familia de funciones BUG() fueron originalmente diseƱadas para actuar como una "situación imposible", confirmar y disponer de un hilo del kernel de forma "segura", estas funciones han resultado ser demasiado arriesgadas. (e.g. "Āæen quĆ© orden se necesitan liberar los locks? ĀæSe han restaurado sus estados?). La popular función BUG() desestabilizarĆ” el sistema o lo romperĆ” totalmente, lo cual hace imposible depurarlo o incluso generar reportes de crash. Linus tiene una `opinión muy fuerte `_ y sentimientos `sobre esto `_.”h]”(hXsUse WARN() y WARN_ON() en su lugar, y gestione las condiciones de error ā€œimposiblesā€ tan elegantemente como se pueda. Mientras que la familia de funciones BUG() fueron originalmente diseƱadas para actuar como una ā€œsituación imposibleā€, confirmar y disponer de un hilo del kernel de forma ā€œseguraā€, estas funciones han resultado ser demasiado arriesgadas. (e.g. ā€œĀæen quĆ© orden se necesitan liberar los locks? ĀæSe han restaurado sus estados?). La popular función BUG() desestabilizarĆ” el sistema o lo romperĆ” totalmente, lo cual hace imposible depurarlo o incluso generar reportes de crash. Linus tiene una ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒy`opinión muy fuerte `_”h]”hŒopinión muy fuerte”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œopinión muy fuerte”jŃŒ`https://lore.kernel.org/lkml/CA+55aFy6jNLsywVYdGp83AMrXBo_P-pkjkphPGrO=82SPKCpLQ@mail.gmail.com/”uh1jIhjubjx)”}”(hŒc ”h]”h}”(h]”Œopinion-muy-fuerte”ah ]”h"]”Œopinión muy fuerte”ah$]”h&]”Œrefuri”j0uh1jwjąKhjubhŒ y sentimientos ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒp`sobre esto `_”h]”hŒ sobre esto”…””}”(hjBh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ sobre esto”jŃŒ`https://lore.kernel.org/lkml/CAHk-=whDHsbK3HTOpTF=ue_o04onRwTEaK_ZoJp_fjbqq4+=Jw@mail.gmail.com/”uh1jIhjubjx)”}”(hŒc ”h]”h}”(h]”Œ sobre-esto”ah ]”h"]”Œ sobre esto”ah$]”h&]”Œrefuri”jRuh1jwjąKhjubhŒ.”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K%hjh²hubh¼)”}”(hXNótese que la familia de funciones WARN() Ćŗnicamente deberĆ­a ser usada en situaciones que se "esperan no sean alcanzables". Si se quiere avisar sobre situaciones "alcanzables pero no deseadas", Ćŗsese la familia de funciones pr_warn(). Los responsables del sistema pueden haber definido *panic_on_warn* sysctl para asegurarse que sus sistemas no continĆŗan ejecutĆ”ndose en presencia del condiciones "no alcanzables". (Por ejemplo, vĆ©ase commits como `este `_.)”h]”(hX*Nótese que la familia de funciones WARN() Ćŗnicamente deberĆ­a ser usada en situaciones que se ā€œesperan no sean alcanzablesā€. Si se quiere avisar sobre situaciones ā€œalcanzables pero no deseadasā€, Ćŗsese la familia de funciones pr_warn(). Los responsables del sistema pueden haber definido ”…””}”(hjjh²hh³Nh“NubhŒemphasis”“”)”}”(hŒ*panic_on_warn*”h]”hŒ panic_on_warn”…””}”(hjth²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jrhjjubhŒš sysctl para asegurarse que sus sistemas no continĆŗan ejecutĆ”ndose en presencia del condiciones ā€œno alcanzablesā€. (Por ejemplo, vĆ©ase commits como ”…””}”(hjjh²hh³Nh“NubjJ)”}”(hŒO`este `_”h]”hŒeste”…””}”(hj†h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œeste”jŃŒEhttps://git.kernel.org/linus/d4689846881d160a4d12a514e991a740bcb5d65a”uh1jIhjjubjx)”}”(hŒH ”h]”h}”(h]”Œeste”ah ]”h"]”Œeste”ah$]”h&]”Œrefuri”j–uh1jwjąKhjjubhŒ.)”…””}”(hjjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K2hjh²hubeh}”(h]”Œ bug-y-bug-on”ah ]”h"]”Œbug() y bug_on()”ah$]”h&]”uh1j…hj‡h²hh³hģh“K$ubj†)”}”(hhh]”(j‹)”}”(hŒ@Operaciones aritmĆ©ticas en los argumentos de reserva de memoria”h]”hŒ@Operaciones aritmĆ©ticas en los argumentos de reserva de memoria”…””}”(hj¹h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj¶h²hh³hģh“Kitem), GFP_KERNEL);”h]”hŒ\header = kzalloc(sizeof(*header) + count * sizeof(*header->item), GFP_KERNEL);”…””}”hj[sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jõh³hģh“K[hj¶h²hubh¼)”}”(hŒEn vez de eso emplee::”h]”hŒEn vez de eso emplee:”…””}”(hjih²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K^hj¶h²hubjö)”}”(hŒ?header = kzalloc(struct_size(header, item, count), GFP_KERNEL);”h]”hŒ?header = kzalloc(struct_size(header, item, count), GFP_KERNEL);”…””}”hjwsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jõh³hģh“K`hj¶h²hubhŒnote”“”)”}”(hŒ÷Si se usa struct_size() en una estructura que contiene un elemento de longitud cero o un array de un Ćŗnico elemento como un array miembro, por favor reescribir ese uso y cambiar a un `miembro array flexible <#zero-length-and-one-element-arrays>`_”h]”h¼)”}”(hŒ÷Si se usa struct_size() en una estructura que contiene un elemento de longitud cero o un array de un Ćŗnico elemento como un array miembro, por favor reescribir ese uso y cambiar a un `miembro array flexible <#zero-length-and-one-element-arrays>`_”h]”(hŒøSi se usa struct_size() en una estructura que contiene un elemento de longitud cero o un array de un Ćŗnico elemento como un array miembro, por favor reescribir ese uso y cambiar a un ”…””}”(hj‹h²hh³Nh“NubjJ)”}”(hŒ?`miembro array flexible <#zero-length-and-one-element-arrays>`_”h]”hŒmiembro array flexible”…””}”(hj“h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œmiembro array flexible”jŃŒ##zero-length-and-one-element-arrays”uh1jIhj‹ubjx)”}”(hŒ& <#zero-length-and-one-element-arrays>”h]”h}”(h]”Œmiembro-array-flexible”ah ]”h"]”Œmiembro array flexible”ah$]”h&]”Œrefuri”j£uh1jwjąKhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kbhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j…hj¶h²hh³hģh“Nubh¼)”}”(hŒ€Para otros cĆ”lculos, por favor use las funciones de ayuda: size_mul(), size_add(), and size_sub(). Por ejemplo, en el caso de::”h]”hŒPara otros cĆ”lculos, por favor use las funciones de ayuda: size_mul(), size_add(), and size_sub(). Por ejemplo, en el caso de:”…””}”(hj½h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khhj¶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&]”jjuh1jõh³hģh“Kkhj¶h²hubh¼)”}”(hŒRe-escrĆ­base, como::”h]”hŒRe-escrĆ­base, como:”…””}”(hjŁh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kmhj¶h²hubjö)”}”(hŒfoo = krealloc(size_add(current_size, size_mul(chunk_size, size_sub(count, 3))), GFP_KERNEL);”h]”hŒfoo = krealloc(size_add(current_size, size_mul(chunk_size, size_sub(count, 3))), GFP_KERNEL);”…””}”hjēsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jõh³hģh“Kohj¶h²hubh¼)”}”(hŒŃPara mĆ”s detalles, mire tambiĆ©n array3_size() y flex_array_size(), como tambiĆ©n la familia de funciones relacionadas check_mul_overflow(), check_add_overflow(), check_sub_overflow(), y check_shl_overflow().”h]”hŒŃPara mĆ”s detalles, mire tambiĆ©n array3_size() y flex_array_size(), como tambiĆ©n la familia de funciones relacionadas check_mul_overflow(), check_add_overflow(), check_sub_overflow(), y check_shl_overflow().”…””}”(hjõh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kshj¶h²hubeh}”(h]”Œ?operaciones-aritmeticas-en-los-argumentos-de-reserva-de-memoria”ah ]”h"]”Œ@operaciones aritmĆ©ticas en los argumentos de reserva de memoria”ah$]”h&]”uh1j…hj‡h²hh³hģh“K`_ para evitar avisos futuros en el compilador. Para casos que todavĆ­a necesitan cadenas de caracteres que se rellenen al final con el caracter NUL, usar strtomem_pad().”h]”(hŒ™Si una función usa cadenas de caracteres que no necesitan terminar en NUL, deberĆ­a usarse strtomem(), y el destino deberĆ­a seƱalarse con el atributo ”…””}”(hj˜h²hh³Nh“NubjJ)”}”(hŒS`__nonstring `_”h]”hŒ __nonstring”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ __nonstring”jŃŒBhttps://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html”uh1jIhj˜ubjx)”}”(hŒE ”h]”h}”(h]”Œ nonstring”ah ]”h"]”Œ __nonstring”ah$]”h&]”Œrefuri”j°uh1jwjąKhj˜ubhŒØ para evitar avisos futuros en el compilador. Para casos que todavĆ­a necesitan cadenas de caracteres que se rellenen al final con el caracter NUL, usar strtomem_pad().”…””}”(hj˜h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K”hjkh²hubeh}”(h]”Œ2strncpy-en-cadenas-de-caracteres-terminadas-en-nul”ah ]”h"]”Œ4strncpy() en cadenas de caracteres terminadas en 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¼)”}”(hXstrlcpy() primero lee por completo el buffer de origen (ya que el valor devuelto intenta ser el mismo que el de strlen()). Esta lectura puede sobrepasar el lĆ­mite de tamaƱo del destino. Esto ineficiente y puede causar desbordamientos de lectura si la cadena de origen no estĆ” terminada en el carĆ”cter NUL. El reemplazo seguro de esta función es strscpy(), pero se ha de tener cuidado que en los casos en lso que se usase el valor devuelto de strlcpy(), ya que strscpy() devolverĆ” valores negativos de erno cuando se produzcan truncados.”h]”hXstrlcpy() primero lee por completo el buffer de origen (ya que el valor devuelto intenta ser el mismo que el de strlen()). Esta lectura puede sobrepasar el lĆ­mite de tamaƱo del destino. Esto ineficiente y puede causar desbordamientos de lectura si la cadena de origen no estĆ” terminada en el carĆ”cter NUL. El reemplazo seguro de esta función es strscpy(), pero se ha de tener cuidado que en los casos en lso que se usase el valor devuelto de strlcpy(), ya que strscpy() devolverĆ” valores negativos de erno cuando se produzcan truncados.”…””}”(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ŒEspecificación de formato %p”h]”hŒEspecificación de formato %p”…””}”(hjśh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj÷h²hh³hģh“Kµubh¼)”}”(hX(Tradicionalmente,el uso de "%p" en el formato de cadenas de caracteres resultarĆ­a en exponer esas direcciones en dmesg, proc, sysfs, etc. En vez de dejar que sean una vulnerabilidad, todos los "%p" que se usan en el kernel se imprimen como un hash, haciĆ©ndolos efectivamente inutilizables para usarlos como direcciones de memoria. Nuevos usos de "%p" no deberĆ­an ser aƱadidos al kernel. Para textos de direcciones, usar "%pS" es mejor, ya que resulta en el nombre del sĆ­mbolo. Para prĆ”cticamente el resto de casos, mejor no usar "%p" en absoluto.”h]”hX<Tradicionalmente,el uso de ā€œ%pā€ en el formato de cadenas de caracteres resultarĆ­a en exponer esas direcciones en dmesg, proc, sysfs, etc. En vez de dejar que sean una vulnerabilidad, todos los ā€œ%pā€ que se usan en el kernel se imprimen como un hash, haciĆ©ndolos efectivamente inutilizables para usarlos como direcciones de memoria. Nuevos usos de ā€œ%pā€ no deberĆ­an ser aƱadidos al kernel. Para textos de direcciones, usar ā€œ%pSā€ es mejor, ya que resulta en el nombre del sĆ­mbolo. Para prĆ”cticamente el resto de casos, mejor no usar ā€œ%pā€ en absoluto.”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K¶hj÷h²hubh¼)”}”(hŒ–Parafraseando las actuales `direcciones de Linus `_:”h]”(hŒParafraseando las actuales ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒz`direcciones de Linus `_”h]”hŒdirecciones de Linus”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œdirecciones de Linus”jŃŒ`https://lore.kernel.org/lkml/CA+55aFwQEd_d40g4mUCSsVRZzrFPUJt74vc6PPpb675hYNXcKw@mail.gmail.com/”uh1jIhjubjx)”}”(hŒc ”h]”h}”(h]”Œdirecciones-de-linus”ah ]”h"]”Œdirecciones de linus”ah$]”h&]”Œrefuri”j.uh1jwjąKhjubhŒ:”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kæhj÷h²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ“Si el valor "hasheado" "%p" no tienen ninguna finalidad, preguntarse si el puntero es realmente importante. ĀæQuizĆ”s se podrĆ­a quitar totalmente?”h]”h¼)”}”(hŒ“Si el valor "hasheado" "%p" no tienen ninguna finalidad, preguntarse si el puntero es realmente importante. ĀæQuizĆ”s se podrĆ­a quitar totalmente?”h]”hŒ›Si el valor ā€œhasheadoā€ ā€œ%pā€ no tienen ninguna finalidad, preguntarse si el puntero es realmente importante. ĀæQuizĆ”s se podrĆ­a quitar totalmente?”…””}”(hjQh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KĮhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHh²hh³hģh“NubjL)”}”(hXSi realmente se piensa que el valor del puntero es importante, ĀæporquĆ© algĆŗn estado del sistema o nivel de privilegio de usuario es considerado "especial"? Si piensa que puede justificarse (en comentarios y mensajes del commit), de forma suficiente como para pasar el escrutinio de Linux, quizĆ”s pueda usar el "%p", a la vez que se asegura que tiene los permisos correspondientes. ”h]”h¼)”}”(hX€Si realmente se piensa que el valor del puntero es importante, ĀæporquĆ© algĆŗn estado del sistema o nivel de privilegio de usuario es considerado "especial"? Si piensa que puede justificarse (en comentarios y mensajes del commit), de forma suficiente como para pasar el escrutinio de Linux, quizĆ”s pueda usar el "%p", a la vez que se asegura que tiene los permisos correspondientes.”h]”hXˆSi realmente se piensa que el valor del puntero es importante, ĀæporquĆ© algĆŗn estado del sistema o nivel de privilegio de usuario es considerado ā€œespecialā€? Si piensa que puede justificarse (en comentarios y mensajes del commit), de forma suficiente como para pasar el escrutinio de Linux, quizĆ”s pueda usar el ā€œ%pā€, a la vez que se asegura que tiene los permisos correspondientes.”…””}”(hjih²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KĆhjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHh²hh³hģh“Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jFh³hģh“KĮhj÷h²hubh¼)”}”(hŒåSi estĆ” depurando algo donde el "%p" hasheado estĆ” causando problemas, se puede arrancar temporalmente con la opción de depuración "`no_hash_pointers `_".”h]”(hŒŽSi estĆ” depurando algo donde el ā€œ%pā€ hasheado estĆ” causando problemas, se puede arrancar temporalmente con la opción de depuración ā€œ”…””}”(hj…h²hh³Nh“NubjJ)”}”(hŒ[`no_hash_pointers `_”h]”hŒno_hash_pointers”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œno_hash_pointers”jŃŒEhttps://git.kernel.org/linus/5ead723a20e0447bc7db33dc3070b420e5f80aa6”uh1jIhj…ubjx)”}”(hŒH ”h]”h}”(h]”Œno-hash-pointers”ah ]”h"]”Œno_hash_pointers”ah$]”h&]”Œrefuri”juh1jwjąKhj…ubhŒā€.”…””}”(hj…h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KŹhj÷h²hubeh}”(h]”Œespecificacion-de-formato-p”ah ]”h"]”Œespecificación de formato %p”ah$]”h&]”uh1j…hj‡h²hh³hģh“Kµubj†)”}”(hhh]”(j‹)”}”(hŒ"Arrays de longitud variable (VLAs)”h]”hŒ"Arrays de longitud variable (VLAs)”…””}”(hjĄh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj½h²hh³hģh“KŠubh¼)”}”(hX~Usando VLA en la pila (stack) produce un código mucho peor que los arrays de tamaƱo estĆ”tico. Mientras que estos errores no triviales de `rendimiento `_ son razón suficiente para no usar VLAs, esto ademĆ”s son un riesgo de seguridad. El crecimiento dinĆ”mico del array en la pila, puede exceder la memoria restante en el segmento de la pila. Esto podrĆ­a llevara a un fallo, posible sobre-escritura de contenido al final de la pila (cuando se construye sin `CONFIG_THREAD_INFO_IN_TASK=y`), o sobre-escritura de la memoria adyacente a la pila (cuando se construye sin `CONFIG_VMAP_STACK=y`).”h]”(hŒŒUsando VLA en la pila (stack) produce un código mucho peor que los arrays de tamaƱo estĆ”tico. Mientras que estos errores no triviales de ”…””}”(hjĪh²hh³Nh“NubjJ)”}”(hŒ:`rendimiento `_”h]”hŒ rendimiento”…””}”(hjÖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ rendimiento”jŃŒ)https://git.kernel.org/linus/02361bc77888”uh1jIhjĪubjx)”}”(hŒ, ”h]”h}”(h]”Œ rendimiento”ah ]”h"]”Œ rendimiento”ah$]”h&]”Œrefuri”jęuh1jwjąKhjĪubhX3 son razón suficiente para no usar VLAs, esto ademĆ”s son un riesgo de seguridad. El crecimiento dinĆ”mico del array en la pila, puede exceder la memoria restante en el segmento de la pila. Esto podrĆ­a llevara a un fallo, posible sobre-escritura de contenido al final de la pila (cuando se construye sin ”…””}”(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&]”uh1jåhjĪubhŒP), o sobre-escritura de la memoria adyacente a la pila (cuando se construye sin ”…””}”(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&]”uh1jåhjĪubhŒ).”…””}”(hjĪh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KŃhj½h²hubeh}”(h]”Œ arrays-de-longitud-variable-vlas”ah ]”h"]”Œ"arrays de longitud variable (vlas)”ah$]”h&]”uh1j…hj‡h²hh³hģh“KŠubj†)”}”(hhh]”(j‹)”}”(hŒ#Switch case fall-through implĆ­cito”h]”hŒ#Switch case fall-through implĆ­cito”…””}”(hj-h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj*h²hh³hģh“KŻubh¼)”}”(hX˜El lenguaje C permite a las sentencias 'switch' saltar de un caso al siguiente caso cuando la sentencia de ruptura "break" no aparece al final del caso. Esto, introduce ambigüedad en el código, ya que no siempre estĆ” claro si el 'break' que falta es intencionado o un olvido. Por ejemplo, no es obvio solamente mirando al código si `STATE_ONE` estĆ” escrito para intencionadamente saltar en `STATE_TWO`::”h]”(hX\El lenguaje C permite a las sentencias ā€˜switch’ saltar de un caso al siguiente caso cuando la sentencia de ruptura ā€œbreakā€ no aparece al final del caso. Esto, introduce ambigüedad en el código, ya que no siempre estĆ” claro si el ā€˜break’ que falta es intencionado o un olvido. Por ejemplo, no es obvio solamente mirando al código si ”…””}”(hj;h²hh³Nh“Nubję)”}”(hŒ `STATE_ONE`”h]”hŒ STATE_ONE”…””}”(hjCh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj;ubhŒ0 estĆ” escrito para intencionadamente saltar en ”…””}”(hj;h²hh³Nh“Nubję)”}”(hŒ `STATE_TWO`”h]”hŒ STATE_TWO”…””}”(hjUh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj;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"); }”…””}”hjmsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jõh³hģh“Kåhj*h²hubh¼)”}”(hXYa que ha habido una larga lista de defectos `debidos a declaraciones de "break" que faltan `_, no se permiten 'fall-through' implĆ­citos. Para identificar 'fall-through' intencionados, se ha adoptado la pseudo-palabra-clave macro "falltrhrough", que expande las extensiones de gcc `__attribute__((__fallthrough__)) `_. (Cuando la sintaxis de C17/c18 `[[fallthrough]]` sea mĆ”s comĆŗnmente soportadas por los compiladores de C, analizadores estĆ”ticos, e IDEs, se puede cambiar a usar esa sintaxis para esa pseudo-palabra-clave.”h]”(hŒ-Ya que ha habido una larga lista de defectos ”…””}”(hj{h²hh³Nh“NubjJ)”}”(hŒb`debidos a declaraciones de "break" que faltan `_”h]”hŒ1debidos a declaraciones de ā€œbreakā€ que faltan”…””}”(hjƒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ-debidos a declaraciones de "break" que faltan”jŃŒ/https://cwe.mitre.org/data/definitions/484.html”uh1jIhj{ubjx)”}”(hŒ2 ”h]”h}”(h]”Œ+debidos-a-declaraciones-de-break-que-faltan”ah ]”h"]”Œ-debidos a declaraciones de "break" que faltan”ah$]”h&]”Œrefuri”j“uh1jwjąKhj{ubhŒČ, no se permiten ā€˜fall-through’ implĆ­citos. Para identificar ā€˜fall-through’ intencionados, se ha adoptado la pseudo-palabra-clave macro ā€œfalltrhroughā€, que expande las extensiones de gcc ”…””}”(hj{h²hh³Nh“NubjJ)”}”(hŒb`__attribute__((__fallthrough__)) `_”h]”hŒ __attribute__((__fallthrough__))”…””}”(hj„h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ __attribute__((__fallthrough__))”jŃŒ”h]”h}”(h]”Œattribute-fallthrough”ah ]”h"]”Œ __attribute__((__fallthrough__))”ah$]”h&]”Œrefuri”jµuh1jwjąKhj{ubhŒ!. (Cuando la sintaxis de C17/c18 ”…””}”(hj{h²hh³Nh“Nubję)”}”(hŒ`[[fallthrough]]`”h]”hŒ[[fallthrough]]”…””}”(hjĒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj{ubhŒ  sea mĆ”s comĆŗnmente soportadas por los compiladores de C, analizadores estĆ”ticos, e IDEs, se puede cambiar a usar esa sintaxis para esa pseudo-palabra-clave.”…””}”(hj{h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kļhj*h²hubh¼)”}”(hŒ5Todos los bloques switch/case deben acabar en uno de:”h]”hŒ5Todos los bloques switch/case deben acabar en uno de:”…””}”(hjßh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kłhj*h²hubjG)”}”(hhh]”(jL)”}”(hŒbreak;”h]”h¼)”}”(hjņh]”hŒbreak;”…””}”(hjōh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kūhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjķh²hh³hģh“NubjL)”}”(hŒ fallthrough;”h]”h¼)”}”(hj h]”hŒ fallthrough;”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kühjubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjķh²hh³hģh“NubjL)”}”(hŒ continue;”h]”h¼)”}”(hj h]”hŒ continue;”…””}”(hj"h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kżhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjķh²hh³hģh“NubjL)”}”(hŒ goto