2015-06-07 6 views
4

Я отладки производства код, написанный на C и его простейшей форме можно представить в виде -32-битное целочисленное деление дает 0x7fffffff в качестве фактора на PowerPC

void 
test_fun(int sr) 
{ 
    int hr = 0; 
    #define ME 65535 
    #define SE 256 

    sr = sr/SE;    <-- This should yield 0 
    if(sr == 1) 
     hr = ME; 
    else 
     hr = (ME+1)/sr;  <-- We should crash here. 
} 

Мы проходим sr, как 128, который в идеале должен дать в делении на нулевую ошибку в процессоре. Я вижу, что это деление происходит успешно с частным как 0x7ffffffff (hr - это значение). Это не происходит (он падает при попытке деления на ноль), когда я компилирую и запускаю то же самое на платформе Intel с помощью gcc.

Хотите знать принцип этого большого частного. Не уверен, что это просто какая-то другая ошибка, которую мне еще нужно раскрыть. Может кто-нибудь помочь мне с другой программой, которая делает то же самое?

+2

Целочисленное деление на ноль дает * неопределенное поведение *. Вы должны выполнить явную проверку для 'sr == 0'. –

+0

Я считаю, что на PowerPC это даст какое-то исключение. Работает ли он на какой-то операционной системе или в виде голого металла? –

+0

@Eugene: он имеет NetBSD 5.1 в качестве операционной системы –

ответ

3

Отдел по ноль undefined behaviour, см. C11 standard6.5.5#5 (окончательный вариант).

Получение ловушки или SIGFPE - это просто любезность CPU/OS. PowerPC как обычный RISC-процессор не улавливает его, так как его можно безопасно обнаруживать простой проверкой делителя прямо перед выполнением фактического деления. x86 OTOH делает поймать это - типичное поведение CISC.

Если требуется более высокий уровень стандартного уровня, вы, вероятно, пропустили параметр компилятора, который автоматически испускает эту проверку. Например, POSIX не применяет SIGFPE, это необязательно.

+0

Спасибо. Однако я считаю, что это большое значение как фактор является результатом некоторого цифрового алгоритма. Хотелось бы также указать на это. –

+1

@RIPUNJAYTRIPATHI: Длинное разделение. –

+0

@Oliver Charlesworth: Я все еще ищу этот алгоритм длинного разделения.Из вашего инстинкта заключается в том, что алгоритм генерирует такой тип частного или он просто ставит отдельное/уникальное значение в результате проверки дивизора на уровне процессора, чтобы обозначить ошибку. Другими словами, возможно ли для другого числителя с делителем 0 генерировать другое значение частного? –

3

В руководстве по архитектуре PPC (которое вы можете получить от IBM), деление на 0 на PPC не приводит к каким-либо сигналам или ловушкам; вместо этого вы получаете некоторое неопределенное значение, которое зависит от процессора и процессора. В вашем случае он выглядит конкретным вариантом PPC, который вы генерируете MAXINT (наибольшее положительное целое число) при делении положительного числа на 0.

 Смежные вопросы

  • Нет связанных вопросов^_^