OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 27 Март, 2024 08:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 11:57 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Александр Ильин писал(а):
Вот, кстати, есть дополнительная польза от оптимизации. : )
Наверное, тут будет точнее --- есть дополнительная польза от мотивации Александра Ильина пользоваться компилятором XDS :)
Я имел в виду то, что оптимизатор берётся переинтерпретировать текст, написанный программистом, без потери смысла, и тем самым обнаруживает смысловые лакуны в первоисточнике.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 11:59 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Ещё из отличий новой версии XDS. Раньше, вроде, никогда не всплывало сообщение:
Код:
* [*** 0.00 F193]
* generation of new symbol file not allowed
По всей видимости это связано с проверкой согласованности импорта. Интересно, а раньше это не проверялось? Или проверялось и по тихому перекомпилировались все модули, которые импортируют этот?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 12:03 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
igor писал(а):
Ещё из отличий новой версии XDS. Раньше, вроде, никогда не всплывало сообщение:
Код:
* [*** 0.00 F193]
* generation of new symbol file not allowed
Не, это всегда было. Надо включить опцию CHANGESYM (см. в xc.hlp).

Её выключают, чтобы запретить компилятору менять интерфейс модулей. Интерфейс может быть зафиксирован в связи с тем, что определения (definition modules) отдали заказчику, или наоборот, если определения получены от третьих лиц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 12:40 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
igor писал(а):
Ещё из отличий новой версии XDS. Раньше, вроде, никогда не всплывало сообщение: ...
Не, это всегда было. Надо включить опцию CHANGESYM (см. в xc.hlp).
Посмотрел. Действительно, эта опция по умолчанию отключена, и в старой и в новой версии.
Включил у себя эту опцию :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 13:54 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Да, Вы нашли мою смысловую ошибку.
Интересно, а много ещё возможно ошибок, не вылезающих в отладочном режиме? В дельфях я такого вроде бы не встречал...

С меня чай, как и обещано :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 14:10 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
GameHunter писал(а):
В дельфях я такого вроде бы не встречал...
В Delphi неинициализированные стековые переменные работают точно так же, и точно так же могут давать псевдослучайные сбои. А вот при выделении под объект динамической памяти там обязательно затирается нулями весь блок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 15:12 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Александр Ильин писал(а):
Чтобы исправить ошибку, нужно в строке 165 модуля GeneralParticle заменить "PassedDistance:=0;" на "r.PassedDistance:=0;".
Alexey Veselovsky обратил внимание на то, что локальную переменную PassedDistance тоже надо инициализировать, так как она далее используется в выражении PassedDistance:=PassedDistance+...
Поэтому строку "r.PassedDistance:=0;" надо добавить рядом с "PassedDistance:=0;", а не заменить одно на другое, как я написал ранее.

Спасибо Alexey Veselovsky за внимательность!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 19:33 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Что-то я разошёлся! Давно не работал с дизассемблером, так даже понравилось. Удалось надёжно воспроизвести ещё одну ошибку, о которую я встречал ранее, да ещё и в минимальном проекте. Вот код:
Код:
<* GENPTRINIT+ *> (* Make sure local pointers are initialized, including RECORD fields. *)
<* PROCINLINE+ *> (* Allow procedure inlining. *)
<* CHANGESYM+ *>
<* MAIN+ *>
MODULE Main;

(* ------------------------------------------------------------------------
 * (C) 2012 by Alexander Iljin
 * ------------------------------------------------------------------------ *)

IMPORT
   Out;

TYPE
   (* A stack-based RECORD type with a POINTER field. *)
   Writer = RECORD
      ptr: POINTER TO ARRAY OF CHAR; (* any pointer type will do *)
   END;

PROCEDURE InitModule; (* This procedure will be inlined. *)
VAR
   wr: Writer;
BEGIN
   (* Since GENPTRINIT is ON, the field wr.ptr must be set NIL, but that
    * does not happen if the procedure is inlined. The compiler simply does
    * not generate the initialization code (typically that would be a "push 0"
    * instruction), and whatever is in the stack is left in the pointer field.
    * In real-life programs this leads to random 'invalid location' traps. *)
   IF wr.ptr # NIL THEN
      Out.String('Error!');
   ELSE
      Out.String('Test passed.');
   END;
END InitModule;

BEGIN
   InitModule;
END Main.
Для компиляции выполнить: xc =make Main.ob2
Для запуска: main.exe
Выдаст "Error!" для XDS 2.50, 2.51, 2.60 beta.

Суть в том, что при включенной опции GENPTRINIT должны зануляться все локальные указатели, в том числе находящиеся внутри стековых RECORD'ов. И это происходит, но только в том случае, если процедура не заинлайнена. Если процедура инлайнится, то локальная инициализация не происходит, и на месте указателей имеем случайный стековый мусор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Пятница, 06 Январь, 2012 19:47 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Вот ещё баг, полученный упрощением предыдущего:
Код:
<* GENPTRINIT+ *> (* Make sure local pointers are initialized, including RECORD fields. *)
<* PROCINLINE+ *> (* Allow procedure inlining. *)
<* CHANGESYM+ *>
<* MAIN+ *>
MODULE Main;

(* ------------------------------------------------------------------------
 * (C) 2012 by Alexander Iljin
 * ------------------------------------------------------------------------ *)

IMPORT
   Out;

PROCEDURE InitModule; (* This procedure will be inlined. *)
VAR
   ptr: POINTER TO ARRAY OF CHAR;
BEGIN
   (* Since GENPTRINIT is ON, the field wr.ptr must be set NIL, but that
    * does not happen if the procedure is inlined. The compiler simply does
    * not generate the initialization code (typically that would be a "push 0"
    * instruction), and whatever is in the stack is left in the pointer field.
    * In real-life programs this leads to random 'invalid location' traps. *)
   IF ptr # NIL THEN
      Out.String('Error!');
   ELSE
      Out.String('Test passed.');
   END;
END InitModule;

BEGIN
   InitModule;
END Main.
Здесь вместо стекового RECORD имеем обычную локальную переменную-указатель. При включенном GENPTRINIT её значение должно быть однозначно определено: NIL. Однако, XDS 2.50, 2.51 и 2.60 beta при запуске показывают совершенно неожиданный результат: "#RTS: unhandled exception #3: invalid location".
Оказывается, компилятор, не долго думая, просто заменяет код процедуры на пару инструкций:
Код:
push 3
call X2C_TRAP_F
По его мнению, тут однозначно будет трап, так что даже нет смысла генерировать код. А ведь код вполне осмысленный. Более того, нет даже попытки разыменования указателя ptr, идёт только лишь сравнение его с NIL. Трапу просто неоткуда взяться.

Интересно, что XDS 2.50 и 2.51 выдают при компиляции предупреждение
Код:
* [Main.ob2 30.07 W304]
* possibly used before definition "ptr"
   IF $ptr # NIL THEN
Это вполне справедливо, хотя при включенном GENPTRINIT этого предупреждения тоже быть не должно.

А XDS 2.60 beta уже дополнительно предупреждает о том нехорошем действии, что он задумал:
Код:
* [Main.ob2 30.11 W915]
* invalidLocation exception will be raised here
   IF ptr $# NIL THEN
Да, он собирается поднять там исключение. Почему? Зачем? Разыменования указателя как не было, так и нет.

PS: 2.50 и 2.51 тоже выдают предупреждение о том, что будет исключение, но только если отключить PROCINLINE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Воскресенье, 15 Январь, 2012 13:40 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Код:
PROCEDURE GetChar (): CHAR;
BEGIN RETURN CHR(65);  (* "A" *)
END GetChar;

PROCEDURE Do*;
VAR x: LONGINT; ch: CHAR;
BEGIN ch := CHR(65);
   x := 505 * ORD(ch);  (* ok *)
   x := 505 * ORD(GetChar());  (* whole overflow *)
END Do;
Почему в первой строчке всё OK, а во второй whole overflow? Какая компилятору разница? (XDS v2.60 beta)

На практике решил пролемку так:
Код:
   x := LONG(505) * ORD(GetChar());  (* ok *)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 12:17 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Если INTEGER и CHAR одинаковой разрядности, то понятно. В 1-м присваивании компилятор знает что значение ch - мало, и переполнения быть не может. Во 2-м присваивании значение 2-го множителя ему неизвестно, поскольку для процедуры Do считает функцию GetChar чёрным ящиком.

И Вместо LONG(505) 505L не подойдёт?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 13:04 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Comdiv писал(а):
Если INTEGER и CHAR одинаковой разрядности, то понятно.
В данном контексте тип INTEGER 16-битный, а тип CHAR 8-битный (т. е. они разной разрядности).

Comdiv писал(а):
В 1-м присваивании компилятор знает что значение ch - мало, и переполнения быть не может. Во 2-м присваивании значение 2-го множителя ему неизвестно, поскольку для процедуры Do считает функцию GetChar чёрным ящиком.
И переменная ch, и функция GetChar() имеют одинаковый тип CHAR, известный уже на этапе компиляции. И даже если бы это было не так, то всё-равно, в обоих случаях функция ORD() возвращает результат типа INTEGER, и никакой другой.

Comdiv писал(а):
И Вместо LONG(505) 505L не подойдёт?
Нет, 505 - это десятичное число. Тогда, уж, лучше было бы записать 1F9L. Но это в Компонентном Паскале, а XDS не поддерживает КП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 13:10 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Кстати, константу 505 я для примера выбрал не случайно. Если значение этой константы уменьшить хотя бы на единицу, то произведение (504 * 65) будет меньше MAX(INTEGER), и переполнение не наступает в обоих случаях.

Собственно, вопрос даже не в том, "почему наступает" или "почему не наступает", а в том, почему по разному себя ведёт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 13:19 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Предположение:
1) В первой строчке компилятор оптимизирует, не выполняя умножение.
2) Во второй выполняет, и, соответсвенно, ругается, что INTEGER*INTEGER->INTEGER даёт переполнение.

Попробуйте дизассемблировать первую строчку. Может там будет просто x := 32825


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 13:29 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
"Оптимизация-шмоптимизация" (С) Info21 :D

Евгений Темиргалеев писал(а):
Попробуйте дизассемблировать первую строчку. Может там будет просто x := 32825
Сворачивание констант? Да, надо будет посмотреть на досуге.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 14:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
igor писал(а):
... а XDS не поддерживает КП
пока.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 17:04 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Предположение:
1) В первой строчке компилятор оптимизирует, не выполняя умножение.
2) Во второй выполняет, и, соответсвенно, ругается, что INTEGER*INTEGER->INTEGER даёт переполнение.

Попробуйте дизассемблировать первую строчку. Может там будет просто x := 32825
Совершенно верное предположение. Это видно и без дизассемблера, достаточно добавить вывод x (Out.Int) и почитать предупреждения компилятора:
Код:
* [Test.ob2 15.04 W900]
* redundant code eliminated
   $ch := CHR(65);

* [Test.ob2 16.04 W900]
* redundant code eliminated
   $x := 505 * ORD(ch);  (* ok *)

* [Test.ob2 16.19 W314]
* variable "ch" has compile time defined value here
   x := 505 * ORD($ch);  (* ok *)

* [Test.ob2 17.12 W314]
* variable "x" has compile time defined value here
   Out.Int($x, 0);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 17:36 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Info21 писал(а):
igor писал(а):
... а XDS не поддерживает КП
пока.
Есть информация, что разработчики XDS собираются его поддерживать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 19:21 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
Евгений Темиргалеев писал(а):
Попробуйте дизассемблировать первую строчку. Может там будет просто x := 32825
Совершенно верное предположение. Это видно и без дизассемблера:
Код:
* [Test.ob2 16.04 W900]
* redundant code eliminated
   $x := 505 * ORD(ch);  (* ok *)

* [Test.ob2 16.19 W314]
* variable "ch" has compile time defined value here
   x := 505 * ORD($ch);  (* ok *)

* [Test.ob2 17.12 W314]
* variable "x" has compile time defined value here
   Out.Int($x, 0);

Из отчёта, предоставленного Александром, следует, что не только первая строчка вычисляется на этапе компиляции, но и вторая тоже. Получается, что различия не связаны с CompileTime или RunTime. То есть, в обоих случаях значение переменной "x" has compiler time defined. Формула INTEGER*INTEGER->INTEGER для обоих случаев одна и та же. Тем не менее, результат обработки этих двух строк компилятором различный.

Очевидное различие в обработке заключается в том, что в первом случае результат произведения неявно преобразуется к типу LONGINT, а во втором случае нет. Двойные стандарты, какбЭ :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XDS 2.6 beta release
СообщениеДобавлено: Понедельник, 16 Январь, 2012 19:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Comdiv писал(а):
Info21 писал(а):
igor писал(а):
... а XDS не поддерживает КП
пока.
Есть информация, что разработчики XDS собираются его поддерживать?
Есть информация, что они могут это сделать достаточно быстро, как только почувствуют, что ситуация созрела.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB