Patch de macaco - Monkey patch

Um patch monkey é uma maneira de um programa estender ou modificar o software do sistema de suporte localmente (afetando apenas a instância em execução do programa).

Etimologia

O termo monkey patch parece ter vindo de um termo anterior, guerrilla patch , que se referia à mudança de código sorrateiramente - e possivelmente incompatível com outros patches - em tempo de execução. A palavra guerrilha , homófona com gorila (ou quase), tornou-se macaco , possivelmente para tornar o patch menos intimidante.

Uma etimologia alternativa é que ela se refere a “manipular” o código (mexer com ele).

Apesar da sugestão do nome, o "patch monkey" às vezes é o método oficial de estender um programa. Por exemplo, navegadores da web como Firefox e Internet Explorer costumavam encorajar isso, embora os navegadores modernos (incluindo o Firefox) agora tenham um sistema oficial de extensões.

Definições

A definição do termo varia dependendo da comunidade que o usa. Em Ruby , Python e em muitas outras linguagens de programação dinâmica , o termo monkey patch refere-se apenas a modificações dinâmicas de uma classe ou módulo em tempo de execução, motivado pela intenção de corrigir o código de terceiros existente como uma solução alternativa para um bug ou recurso que o faz não agir como desejado. Outras formas de modificar classes em tempo de execução têm nomes diferentes, com base em suas diferentes intenções. Por exemplo, no Zope e no Plone , os patches de segurança são freqüentemente entregues usando modificação dinâmica de classe, mas são chamados de hot fixes .

Formulários

O patch do macaco é usado para:

  • Substituir métodos / aulas / atributos / funções em tempo de execução, por exemplo, ao toco para uma função durante os testes;
  • Modificar / estender o comportamento de um produto de terceiros sem manter uma cópia privada do código-fonte;
  • Aplique o resultado de um patch em tempo de execução ao estado na memória , em vez do código-fonte no disco ;
  • Distribuir correções de segurança ou comportamentais que vivem junto com o código-fonte original (um exemplo disso seria distribuir a correção como um plugin para a plataforma Ruby on Rails );
  • Explore diferentes correções automatizadas para fornecer autocura.

Armadilhas

Patches maliciosos, escritos de forma inadequada e / ou mal documentados podem causar problemas:

  • Eles podem levar a problemas de atualização quando o patch faz suposições sobre o objeto corrigido que não são mais verdadeiras; uma nova versão pode muito bem quebrar o patch. Por esse motivo, os patches de macacos costumam ser condicionais e aplicados apenas se for o caso.
  • Se dois módulos tentarem patchear o mesmo método , um deles (o que for executado por último) "vence" e o outro patch não terá efeito, a menos que os patches macacos sejam escritos com um padrão semelhante alias_method_chain.
  • Eles criam uma discrepância entre o código-fonte original e o comportamento observado que pode ser muito confuso para qualquer pessoa que não saiba da existência do patch. Por exemplo, o kernel do Linux detecta módulos proprietários e outros de terceiros, como o driver Nvidia , que interfere nas estruturas do kernel, para que os desenvolvedores não percam seu tempo tentando depurar um problema que eles não podem consertar.
  • Eles podem ser escritos com código malicioso para atacar o programa principal ou uns aos outros. Como exemplo, em 2009, Giorgio Maone, desenvolvedor do NoScript , atacou a extensão Adblock Plus para Firefox, adicionando exceções para que os anúncios em seus próprios sites funcionassem. O código ofensivo também garantiu que, se o usuário tentasse remover as exceções, elas seriam adicionadas novamente. A briga causou raiva generalizada, levando a uma guerra entre as novas regras de adblock sendo empurradas para os usuários, seguido por Maone sabotar as novas, o que eventualmente levou a Mozilla a intervir para mudar as políticas em relação a add-ons.

Exemplos

O exemplo Python a seguir corrige o valor de Pi da biblioteca matemática padrão do Python para torná-lo compatível com 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
>>>

Veja também

Referências