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());
Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top