€•…òŒ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 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”hòŒ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”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÈhjhŸhØh KubhÚ)”}”(hŒ+Sergio Gonzalez ”h]”h¨)”}”(hŒ*Sergio Gonzalez ”h]”(hŒSergio Gonzalez <”…””}”(hj-hžhhŸNh NubhŒ reference”“”)”}”(hŒsergio.collado@gmail.com”h]”hŒsergio.collado@gmail.com”…””}”(hj7hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:sergio.collado@gmail.com”uh1j5hj-ubhŒ>”…””}”(hj-hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh Khj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjubeh}”(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”uh1jch 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”…””}”(hjxhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjshž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 hjshžhubjr)”}”(hhh]”(jw)”}”(hŒ __deprecated”h]”hŒ __deprecated”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj”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 Nubj6)”}”(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”uh1j5hj¥ubjd)”}”(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¾uh1jcŒ 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&]”uh1jqhjshžhhŸhØh Kubjr)”}”(hhh]”(jw)”}”(hŒBUG() y BUG_ON()”h]”hŒBUG() y BUG_ON()”…””}”(hjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjóhž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 Nubj6)”}”(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/”uh1j5hjubjd)”}”(hŒc ”h]”h}”(h]”Œopinion-muy-fuerte”ah ]”h"]”Œopinión muy fuerte”ah$]”h&]”Œrefuri”juh1jcjÌKhjubhŒ y sentimientos ”…””}”(hjhžhhŸNh Nubj6)”}”(hŒp`sobre esto `_”h]”hŒ sobre esto”…””}”(hj.hž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/”uh1j5hjubjd)”}”(hŒc ”h]”h}”(h]”Œ sobre-esto”ah ]”h"]”Œ sobre esto”ah$]”h&]”Œrefuri”j>uh1jcjÌKhjubhŒ.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh K%hjóhž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 ”…””}”(hjVhžhhŸNh NubhŒemphasis”“”)”}”(hŒ*panic_on_warn*”h]”hŒ panic_on_warn”…””}”(hj`hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j^hjVubhŒš sysctl para asegurarse que sus sistemas no continúan ejecutándose en presencia del condiciones “no alcanzablesâ€. (Por ejemplo, véase commits como ”…””}”(hjVhžhhŸNh Nubj6)”}”(hŒO`este `_”h]”hŒeste”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œeste”j½ŒEhttps://git.kernel.org/linus/d4689846881d160a4d12a514e991a740bcb5d65a”uh1j5hjVubjd)”}”(hŒH ”h]”h}”(h]”Œeste”ah ]”h"]”Œeste”ah$]”h&]”Œrefuri”j‚uh1jcjÌKhjVubhŒ.)”…””}”(hjVhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh K2hjóhžhubeh}”(h]”Œ bug-y-bug-on”ah ]”h"]”Œbug() y bug_on()”ah$]”h&]”uh1jqhjshžhhŸhØh K$ubjr)”}”(hhh]”(jw)”}”(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&]”uh1jvhj¢hžhhŸhØh Kitem), GFP_KERNEL);”h]”hŒ\header = kzalloc(sizeof(*header) + count * sizeof(*header->item), GFP_KERNEL);”…””}”hjGsbah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jáhŸhØh K[hj¢hžhubh¨)”}”(hŒEn vez de eso emplee::”h]”hŒEn vez de eso emplee:”…””}”(hjUhž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);”…””}”hjcsbah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1já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 ”…””}”(hjwhžhhŸNh Nubj6)”}”(hŒ?`miembro array flexible <#zero-length-and-one-element-arrays>`_”h]”hŒmiembro array flexible”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œmiembro array flexible”j½Œ##zero-length-and-one-element-arrays”uh1j5hjwubjd)”}”(hŒ& <#zero-length-and-one-element-arrays>”h]”h}”(h]”Œmiembro-array-flexible”ah ]”h"]”Œmiembro array flexible”ah$]”h&]”Œrefuri”juh1jcjÌKhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh Kbhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jqhj¢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&]”jñjòuh1já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&]”jñjòuh1já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&]”uh1jqhjshž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 Nubj6)”}”(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”uh1j5hj„ubjd)”}”(hŒE ”h]”h}”(h]”Œ nonstring”ah ]”h"]”Œ __nonstring”ah$]”h&]”Œrefuri”jœuh1jcjÌ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¡hjWhžhubeh}”(h]”Œ2strncpy-en-cadenas-de-caracteres-terminadas-en-nul”ah ]”h"]”Œ4strncpy() en cadenas de caracteres terminadas en nul”ah$]”h&]”uh1jqhjshžhhŸhØh Kubjr)”}”(hhh]”(jw)”}”(hŒ strlcpy()”h]”hŒ strlcpy()”…””}”(hj¿hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj¼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&]”uh1jqhjshžhhŸhØh Kªubjr)”}”(hhh]”(jw)”}”(hŒEspecificación de formato %p”h]”hŒEspecificación de formato %p”…””}”(hjæhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjã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.”…””}”(hjôhž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 Nubj6)”}”(hŒz`direcciones de Linus `_”h]”hŒdirecciones de Linus”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œdirecciones de Linus”j½Œ`https://lore.kernel.org/lkml/CA+55aFwQEd_d40g4mUCSsVRZzrFPUJt74vc6PPpb675hYNXcKw@mail.gmail.com/”uh1j5hjubjd)”}”(hŒc ”h]”h}”(h]”Œdirecciones-de-linus”ah ]”h"]”Œdirecciones de linus”ah$]”h&]”Œrefuri”juh1jcjÌ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?”…””}”(hj=hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh KÁhj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j7hj4hžhhŸhØh Nubj8)”}”(hXSi 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.”…””}”(hjUhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh KÃhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1j7hj4hžhhŸhØh Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j2hŸ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 “”…””}”(hjqhžhhŸNh Nubj6)”}”(hŒ[`no_hash_pointers `_”h]”hŒno_hash_pointers”…””}”(hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œno_hash_pointers”j½ŒEhttps://git.kernel.org/linus/5ead723a20e0447bc7db33dc3070b420e5f80aa6”uh1j5hjqubjd)”}”(hŒH ”h]”h}”(h]”Œno-hash-pointers”ah ]”h"]”Œno_hash_pointers”ah$]”h&]”Œrefuri”j‰uh1jcjÌKhjqubhŒâ€.”…””}”(hjqhž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&]”uh1jqhjshžhhŸhØh Kµubjr)”}”(hhh]”(jw)”}”(hŒ"Arrays de longitud variable (VLAs)”h]”hŒ"Arrays de longitud variable (VLAs)”…””}”(hj¬hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj©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 Nubj6)”}”(hŒ:`rendimiento `_”h]”hŒ rendimiento”…””}”(hjÂhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ rendimiento”j½Œ)https://git.kernel.org/linus/02361bc77888”uh1j5hjºubjd)”}”(hŒ, ”h]”h}”(h]”Œ rendimiento”ah ]”h"]”Œ rendimiento”ah$]”h&]”Œrefuri”jÒuh1jcjÌ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&]”uh1jqhjshžhhŸhØh KÐubjr)”}”(hhh]”(jw)”}”(hŒ#Switch case fall-through implícito”h]”hŒ#Switch case fall-through implícito”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjhž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”…””}”(hj/hž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”…””}”(hjAhž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Þhjhž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"); }”…””}”hjYsbah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jáhŸhØh Kåhjhž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 ”…””}”(hjghžhhŸNh Nubj6)”}”(hŒb`debidos a declaraciones de "break" que faltan `_”h]”hŒ1debidos a declaraciones de “break†que faltan”…””}”(hjohž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”uh1j5hjgubjd)”}”(hŒ2 ”h]”h}”(h]”Œ+debidos-a-declaraciones-de-break-que-faltan”ah ]”h"]”Œ-debidos a declaraciones de "break" que faltan”ah$]”h&]”Œrefuri”juh1jcjÌKhjgubhŒÈ, 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 ”…””}”(hjghžhhŸNh Nubj6)”}”(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¡uh1jcjÌKhjgubhŒ!. (Cuando la sintaxis de C17/c18 ”…””}”(hjghžhhŸNh NubjÒ)”}”(hŒ`[[fallthrough]]`”h]”hŒ[[fallthrough]]”…””}”(hj³hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjgubhŒ  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.”…””}”(hjghžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh Kïhjhž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ùhjhžhubj3)”}”(hhh]”(j8)”}”(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&]”uh1j7hjÙhžhhŸhØh Nubj8)”}”(hŒ fallthrough;”h]”h¨)”}”(hjõh]”hŒ fallthrough;”…””}”(hj÷hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh Kühjóubah}”(h]”h ]”h"]”h$]”h&]”uh1j7hjÙhžhhŸhØh Nubj8)”}”(hŒ continue;”h]”h¨)”}”(hj h]”hŒ continue;”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhØh Kýhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j7hjÙhžhhŸhØh Nubj8)”}”(hŒ goto