#cpp #c
Что нужно изменить, или возможно хукнуть (перехватить) для изменения правила деления? В моих задачах при делении числа на 0 должен получаться 0. Меня интересует именно изменение предписанного алгоритма
Ответы
Ответ 1
#includeusing namespace std; class Int_type { int k; public: Int_type(int i = 0) : k(i) {} Int_type& operator ++() { ++k; return *this; } Int_type operator ++(int) { Int_type t; ++(t.k); return t; } Int_type& operator =(const int& i) { k = i; return *this; } Int_type& operator /=(const int& i) { k = i ? k / i : 0; return *this;} operator int() const { return k; } }; inline Int_type operator /(const Int_type& n, const int& i) { Int_type t = n; t /= i; return t; } Можете использовать обьекты класса вместо обьектов типа int и делить на ноль int main() { Int_type i; i = 19; ++i; cout << i << endl << i/ 2 << endl << i - 2 < Ответ 2
Спасибо большое за ответ. И все же так как ответов не было долгое время, придумал свое решение через фильтр исключений. Должно работать на все int в 32-битном приложении. Здесь при вызове исключения фильтр проверяет вид операции и заменяет регистр с нулем на единицу. А дальше перепрыгивает на следующую инструкцию #include "stdafx.h" #include#include using namespace std; LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { cout << "Exception code: 0x" << hex << (int)pExceptionInfo->ExceptionRecord->ExceptionCode << " Exception address: 0x" << (DWORD)pExceptionInfo->ContextRecord->Eip << endl; if ((int)pExceptionInfo->ExceptionRecord->ExceptionCode == 0xc0000094) { DWORD presentEIP = (DWORD)pExceptionInfo->ContextRecord->Eip; byte EIPvalue[2]; EIPvalue[0] = *(byte*)presentEIP; EIPvalue[1] = *(byte*)(presentEIP + 0x1); if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0xF9) { pExceptionInfo->ContextRecord->Ecx = 1; cout << "Forced ECX to 1 [1]" << endl; } else if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0x7D) { _asm add DWORD PTR SS : [EBP - 8], 1; pExceptionInfo->ContextRecord->Eip += 3; cout << "Forced ECX to 1 [2]" << endl; } else return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; } int f(int x, int y, int z) { return 2 + x / (2 / (y - z)); } int main() { AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)ExceptionFilter); // Registers our vectored exception handler which is going to catch the exceptions thrown. int res = f(2, 3, 3); //F7F9 cout << "Result: " << dec << res << endl; getchar(); int zero = 1 * 0;//F77D F8 int i; i = 1 + 5 / zero; cout << "Result: " << dec << i << endl; getchar(); return 0; }
Комментариев нет:
Отправить комментарий