if (last_trap_ip == ctx->uc_mcontext.gregs[REG_IP]) {
printf("\tTrapped at %016lx\n", last_trap_ip);
/* * If the same IP is hit more than 10 times in a row, it is * _considered_ an infinite loop.
*/ if (++loop_count_on_same_ip > 10) {
printf("[FAIL]\tDetected SIGTRAP infinite loop\n"); exit(1);
}
int main(int argc, char *argv[])
{
sethandler(SIGTRAP, sigtrap, 0);
/* * Set the Trap Flag (TF) to single-step the test code, therefore to * trigger a SIGTRAP signal after each instruction until the TF is * cleared. * * Because the arithmetic flags are not significant here, the TF is * set by pushing 0x302 onto the stack and then popping it into the * flags register. * * Four instructions in the following asm code are executed with the * TF set, thus the SIGTRAP handler is expected to run four times.
*/
printf("[RUN]\tSIGTRAP infinite loop detection\n"); asmvolatile( #ifdef __x86_64__ /* * Avoid clobbering the redzone * * Equivalent to "sub $128, %rsp", however -128 can be encoded * in a single byte immediate while 128 uses 4 bytes.
*/ "add $-128, %rsp\n\t" #endif "push $0x302\n\t" "popf\n\t" "nop\n\t" "nop\n\t" "push $0x202\n\t" "popf\n\t" #ifdef __x86_64__ "sub $-128, %rsp\n\t" #endif
);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.