Como interceptar um livre chamada de função como hippomocks faz?
-
02-01-2020 - |
Pergunta
Eu estou querendo saber o que hippomocks não interceptar a exit
chamada de função, por exemplo, como mostrado no código abaixo:
MockRepository mocks;
mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
Solução
O código que faz a interceptação é em hippomocks.h
.Ele modifica a memória sinalizadores de proteção para permitir a escrever para o endereço do ponteiro de função e, em seguida, escreve uma instrução de salto no lugar da inicial bytes da função.Quando a rotina não é mais necessário, os bytes originais são restauradas.Este é o mesmo método usado, por exemplo, pelo Microsoft Desvios a biblioteca.
Outras dicas
Lança-se a função passado (neste caso, um simples ponteiro de função) para um char *, pergunta o SO bem para poder escrever para ele (usando mprotect em sistemas unix e VirtualProtect no Windows) e, em seguida, modifica os primeiros 5 a 14 bytes para ser uma instrução de salto incondicional.Ele coloca o endereço de uma gerado (usando modelos) função com a mesma assinatura no lugar, efetivamente substituindo a função.
Se você quiser, pode reutilizar HippoMocks' código diretamente, através da construção de um objeto de classe de Substituir a pilha, com os argumentos certos.Você também pode copiar o código (no mais novo hippomocks.h no GitHub tanto 32/64 bit x86, ARM e o polegar são suportados).É em torno da linha 200, de forma relativamente alto.Você também precisará copiar os horrible_cast classe e o Desproteger classe;o primeiro permite que ele lance feitiços um membro de ponteiro de função para qualquer outro tipo (o que não é possível com reinterpret_cast) e o segundo envolve o sistema operacional específico desproteger (e reprotect) chamadas.
Na limpeza de código para C++11 eu também extraídos exatamente esse subconjunto, então agora você pode usar o detalhe/substituir.h ficheiro para obter apenas o código que faz isso.Para um link direto, olhar https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h .