C-транслятор и переполнение при DIV.

Тема в разделе "LANGS.C", создана пользователем mathio, 27 июн 2007.

  1. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Общий hi.
    Понадобилось тут получить исключение от переполнения в результате отработки DIV(но без деления на нуль).
    Всем известно, что подобный код вызовет нужный ексепшн:
    Код (Text):
    1. mov   ecx, 02h
    2. mov   eax, 0400h
    3. div     cl
    Так вот, требуется заставить C-транслятор(например, MS'овский) сгенерить подобный фолтовый код.
    Размерность делителя(8/16/32), ессно мне не важна, ибо главное чтобы полученное соответствующее частное не помещалось в неё.
    Использование директивы __asm() не подходит.

    Весь сакс в том, что сам-по-себе-высокоуровневый-контроль-типов/оптимизация/защита от переполнения в данном случае не дают получить требуемое.
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Случайно не бетатестером в Мелкософте устроился? :):):)
    Мой ответ сходу - вряд ли что у тебя получится... по стандарту С++ все арифметические вычисления выполняются в int (если ни один из операндов не long), что составляет для Win32, например - 32 бита. Но при делении делимое расширяется до 64 - cdq, например для int и xor edx, edx для unsigned. Но так как частное никак не больше делимого, то увы... больше 32бит ему не бывать... вот если смешать знаковвые и беззнаковые - то неправильный результат получить можно, а ошибку вряд ли. Тут надо совсем невменяемый компилятор найти :) Разве что на ноль делить, если так важен сам факт ошибки - при максимальной оптимизации ни один нормальный компилер проверок не делает :)
     
  3. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Попробуй так:
    Код (Text):
    1. short a[]={0xca83,0xf7ff,0xc3f4};
    2. int(*f)()=(int(__cdecl*)(void))&a;
    3. f();
     
  4. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Ну, дык, этож тоже самое почти, что и _asm директива :derisive:
    Ибо получается, не переносимый код.
     
  5. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Тут в принципе нереально сделать переносимый код. Компилятор _всегда_ перед signed div ставит cdq, а перед unsigned div - xor edx,edx.