Un parche de mono es una forma de que un programa extienda o modifique el software del sistema de soporte localmente (afectando solo la instancia en ejecución del programa).
Etimología
El término parche de mono parece provenir de un término anterior, parche de guerrilla , que se refería a cambiar el código de manera furtiva, y posiblemente incompatible con otros parches similares, en tiempo de ejecución. [1] La palabra guerrilla , homófona con gorila (o casi), se convirtió en mono , posiblemente para hacer que el parche suene menos intimidante. [1] Una etimología alternativa es que se refiere a "hacer el tonto" con el código (jugar con él).
A pesar de la sugerencia del nombre, el "parche de mono" es a veces el método oficial para extender un programa. Por ejemplo, los navegadores web como Firefox e Internet Explorer solían fomentar esto, aunque los navegadores modernos (incluido Firefox) ahora tienen un sistema de extensiones oficial.
Definiciones
La definición del término varía según la comunidad que lo usa. En Ruby , [2] Python , [3] y muchos otros lenguajes de programación dinámica , el término parche mono solo se refiere a modificaciones dinámicas de una clase o módulo en tiempo de ejecución, motivadas por la intención de parchear código de terceros existente como una solución para un error o característica que no actúa como se desea. Otras formas de modificar clases en tiempo de ejecución tienen diferentes nombres, según sus diferentes intenciones. Por ejemplo, en Zope y Plone , los parches de seguridad a menudo se entregan mediante la modificación de clase dinámica, pero se denominan correcciones urgentes . [ cita requerida ]
Aplicaciones
El parche de mono se usa para:
- Reemplazar métodos / clases / atributos / funciones en tiempo de ejecución, por ejemplo, para stub a cabo una función durante la prueba;
- Modificar / ampliar el comportamiento de un producto de terceros sin mantener una copia privada del código fuente;
- Aplicar el resultado de un parche en tiempo de ejecución al estado en la memoria , en lugar del código fuente en el disco ;
- Distribuir las correcciones de seguridad o de comportamiento que conviven con el código fuente original (un ejemplo de esto sería distribuir la corrección como un complemento para la plataforma Ruby on Rails );
- Explore diferentes correcciones automatizadas para proporcionar autorreparación. [4]
Trampas
Los parches de mono maliciosos, escritos de manera incompetente y / o mal documentados pueden generar problemas:
- Pueden dar lugar a problemas de actualización cuando el parche hace suposiciones sobre el objeto parcheado que ya no son ciertas; una nueva versión puede romper el parche. Por esta razón, los parches de monos a menudo se condicionan y solo se aplican si es apropiado. [5]
- Si dos módulos intentan parchear el mono con el mismo método , uno de ellos (el que se ejecute en último lugar) "gana" y el otro parche no tiene ningún efecto, a menos que los parches mono se escriban con un patrón similar
alias_method_chain
. [6] - Crean una discrepancia entre el código fuente original y el comportamiento observado que puede resultar muy confuso para cualquiera que desconozca la existencia del parche. Por ejemplo, el kernel de Linux detecta módulos propietarios y otros módulos de terceros, como el controlador Nvidia , que manipulan las estructuras del kernel, de modo que los desarrolladores no pierdan el tiempo tratando de depurar un problema que no pueden solucionar. [7]
- Se pueden escribir con código malicioso para atacar el programa principal o entre sí. Como ejemplo, en 2009, Giorgio Maone, desarrollador de NoScript , atacó la extensión Adblock Plus para Firefox, agregando excepciones para que los anuncios en sus propios sitios web funcionaran. El código infractor también se aseguró de que si el usuario intentaba eliminar las excepciones, se agregarían nuevamente. La disputa causó una ira generalizada, lo que llevó a una guerra de ida y vuelta entre las nuevas reglas de adblock que se enviaban a los usuarios, seguido de Maone saboteando las nuevas, lo que finalmente llevó a Mozilla a intervenir para cambiar las políticas con respecto a los complementos. [8]
Ejemplos de
El siguiente ejemplo de Python monkey-parchea el valor de Pi de la biblioteca matemática estándar de Python para que sea compatible con Indiana Pi Bill .
>>> importar matemáticas >>> matemáticas . pi 3.141592653589793 >>> matemáticas . pi = 3.2 # monkey-patch el valor de Pi en el módulo matemático >>> math . pi 3.2 ================================ REINICIAR =============== ================= >>> importar matemáticas >>> matemáticas . pi 3,141592653589793 >>>
Ver también
Referencias
- ↑ a b Limi, Alexander; Shane Hathaway (23 de diciembre de 2005). "Parche de mono" . Fundación Plone. Archivado desde el original el 4 de junio de 2008 . Consultado el 3 de julio de 2008 .CS1 maint: bot: estado de URL original desconocido ( enlace )
- ^ "Refinando Ruby" . 2013-02-27.
- ^ Biswal, Bimal. "Monkey Patching en Python" . Consejos de tecnología de software . Soluciones Mindfire . Consultado el 9 de diciembre de 2013 .
- ^ Durieux, Thomas; Hamadi, Youssef; Monperrus, Martín (2020). "Reescritura de HTML y JavaScript totalmente automatizada para la construcción de un proxy web autorreparable". Pruebas, verificación y confiabilidad de software . 30 (2). arXiv : 1803.08725 . doi : 10.1002 / stvr.1731 . ISSN 0960-0833 .
- ^ "JavaScript mantenible: no modifique los objetos que no le pertenecen" . 2010-03-02.
- ^ "Nuevo en Rails: Módulo # alias_method_chain" . 2006-04-26.
- ^ "Núcleos contaminados - La documentación del núcleo de Linux" . www.kernel.org . Consultado el 12 de julio de 2020 .
- ^ Paul, Ryan (4 de mayo de 2009). "Mozilla reflexiona sobre el cambio de política después de la batalla de extensiones de Firefox" . Ars Technica . Consultado el 12 de julio de 2020 .