Previous Entry Share Next Entry
2016-01

compiler bug

compiler bug

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

или таки bite the bullet и продолжить составлять //gist.github.com/wizzard0/6189922?

потому что кросстрансляторы я люблю, и это не первый раз, и похоже далеко не последний.

а еще мне надо дописать спеку на код, написанный человеком А (не мной, но по моей просьбе), чтобы с ним мог интероперировать код, написанный человеком Б. тоже веселое занятие...

This entry was originally posted at http://wizzard.dreamwidth.org/299227.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
_winnie August 12th, 2013
> например промежуточные результаты получаются шириной в регистр а не шириной в байт. как это дебажить?

Взять эпичное количество сложного кода (много видеокодеков, много архиваторов, много криптографии, много преобразователей текстовых форматов, эмуляторов), собрать из них много почти биективных (чтобы ошибки не маскировались) машин голдберга. Сравнивать, что код до и после - выдаёт один результат.

wizzard0 August 12th, 2013
эээ ну я так и делаю но минимизировать тест кейсы это ни разу не помогает)))

nicka_startcev August 12th, 2013
>неправильно оптимизирует. например промежуточные результаты получаются шириной в регистр а не шириной в байт. как это дебажить? )

а разве Стандарт не требует считать всё в интах, если не указано иное?

wizzard0 August 12th, 2013
какой еще стандарт?

edit: ну у меня например написано что-то в духе

int a(byte x, byte y){
return x+y;
}

и бац, a(100+500, 100+500) ВНЕЗАПНО равно 1200 а не 176

Edited at 2013-08-12 08:17 pm (UTC)

nicka_startcev August 12th, 2013
>какой еще стандарт?

стандарт языка Си.

flash-gordon.me.uk/ansi.c.txt

для передачи параметров сходу не нашел (как мне помнится, там тоже имеет право до инта расширить), а вот
для вычисления выражений - 3.2.1.1 Characters and integers

A char, a short int, or an int bit-field, or their signed or
unsigned varieties, or an object that has enumeration type, may be
used in an expression wherever an int or unsigned int may be used. If
an int can represent all values of the original type, the value is
converted to an int; otherwise it is converted to an unsigned int.
These are called the integral promotions.

ps: byte там точно 8 бит? а то бывают кривые дефайны

wizzard0 August 12th, 2013
вот хоть кто-нибудь посмотрел бы хоть раз в тэги или сходил бы хоть по одной ссылке.

компилятор у меня из MSIL в Javascript.

thedeemon August 13th, 2013
Компиляторы бывают только из Си! :)

kray_zemli August 12th, 2013
Давным-давно у меня была такая проблема с пятым Borland C, при выборе оптимизирующего компилятора от intel. Я тогда делал расчетную программу. Проблему удалось локализовать посредством тестирования. Ну а потом посмотреть листинг в дебаггере и убедиться, что ошибки в компиляторах иногда бывают.

wizzard0 August 12th, 2013
Что и делаю, собственно.

(Deleted comment)
wizzard0 August 13th, 2013
Второе

_winnie August 13th, 2013
А добавить типизацию в компилятор не получится? Например, CompilerInteger<Byte>

  • 1
?

Log in

No account? Create an account