Toppa scimmia - Monkey patch
Una patch scimmia è un modo per un programma di estendere o modificare localmente il software di sistema di supporto (interessando solo l'istanza in esecuzione del programma).
Etimologia
Il termine scimmia patch sembra provenire da un termine precedente, guerrilla patch , che si riferiva alla modifica del codice in modo subdolo - e forse incompatibile con altre patch simili - in fase di esecuzione. La parola guerrilla , omofono con gorilla (o quasi), divenne scimmia , forse per rendere il suono meno intimidatorio.
Un'etimologia alternativa è che si riferisce a "scimmiarsi" con il codice (fare pasticci con esso).
Nonostante il nome suggerito, la "patch della scimmia" è a volte il metodo ufficiale per estendere un programma. Ad esempio, i browser Web come Firefox e Internet Explorer erano soliti incoraggiare questo, sebbene i browser moderni (incluso Firefox) ora abbiano un sistema di estensioni ufficiale.
Definizioni
La definizione del termine varia a seconda della comunità che lo utilizza. In Ruby , Python e molti altri linguaggi di programmazione dinamica , il termine monkey patch si riferisce solo alle modifiche dinamiche di una classe o di un modulo in fase di esecuzione, motivate dall'intento di correggere il codice di terze parti esistente come soluzione a un bug o a una funzionalità che non funziona. non agire come desiderato. Altre forme di modifica delle classi in fase di esecuzione hanno nomi diversi, in base ai loro diversi intenti. Ad esempio, in Zope e Plone , le patch di sicurezza vengono spesso fornite utilizzando la modifica dinamica della classe, ma sono chiamate hot fix .
Applicazioni
Il patch della scimmia viene utilizzato per:
- Sostituisci metodi / classi / attributi / funzioni in fase di esecuzione, ad esempio per interrompere una funzione durante il test;
- Modificare/estendere il comportamento di un prodotto di terze parti senza mantenere una copia privata del codice sorgente;
- Applicare il risultato di una patch in fase di esecuzione allo stato in memoria , invece del codice sorgente su disco ;
- Distribuire correzioni di sicurezza o comportamentali che convivono con il codice sorgente originale (un esempio di ciò potrebbe essere la distribuzione della correzione come plugin per la piattaforma Ruby on Rails );
- Esplora diverse correzioni automatizzate per fornire l'auto-guarigione.
insidie
Patch di scimmie dannose, scritte in modo incompetente e/o scarsamente documentate possono portare a problemi:
- Possono portare a problemi di aggiornamento quando la patch fa supposizioni sull'oggetto patchato che non sono più vere; una nuova versione potrebbe benissimo rompere la patch. Per questo motivo le patch delle scimmie sono spesso condizionate e applicate solo se appropriato.
- Se due moduli tentano di eseguire la patch scimmia con lo stesso metodo , uno di loro (quello che viene eseguito per ultimo) "vince" e l'altra patch non ha effetto, a meno che le patch scimmia non siano scritte con un modello come
alias_method_chain. - Creano una discrepanza tra il codice sorgente originale e il comportamento osservato che può creare molta confusione a chiunque non sia a conoscenza dell'esistenza della patch. Ad esempio, il kernel Linux rileva moduli proprietari e di terze parti come il driver Nvidia , che manomettono le strutture del kernel, in modo che gli sviluppatori non perdano tempo cercando di eseguire il debug di un problema che non possono risolvere.
- Possono essere scritti con codice dannoso per attaccare il programma principale o l'un l'altro. Ad esempio, nel 2009, Giorgio Maone, sviluppatore di NoScript , ha attaccato l' estensione Adblock Plus per Firefox, aggiungendo eccezioni in modo che gli annunci sui propri siti web funzionassero. Il codice offensivo ha anche assicurato che se l'utente avesse tentato di rimuovere le eccezioni, sarebbero state aggiunte di nuovo. Il litigio ha causato una rabbia diffusa, portando a una guerra avanti e indietro tra le nuove regole di blocco degli annunci inviate agli utenti, seguita da Maone che ha sabotato le nuove, che alla fine ha portato Mozilla a intervenire per modificare le politiche relative ai componenti aggiuntivi.
Esempi
Il seguente esempio Python patcha il valore di Pi dalla libreria matematica Python standard per renderlo compatibile con Indiana Pi Bill .
>>> import math
>>> math.pi
3.141592653589793
>>> math.pi = 3.2 # monkey-patch the value of Pi in the math module
>>> math.pi
3.2
================================ RESTART ================================
>>> import math
>>> math.pi
3.141592653589793
>>>
Guarda anche
- Polyfill
- Programmazione orientata all'aspetto
- Categoria in Obiettivo-C
- Caricamento dinamico
- Metodo di estensione in C#
- Codice automodificante