OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 19 Октябрь, 2017 02:49

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




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Воскресенье, 06 Май, 2012 09:58 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Иван Денисов писал(а):
Добавил предупреждение при опасной компиляции, спасибо ilovb!
Пож., суммируйте суть в двух словах, раз уж Вы продрались сквозь альтернативные истерики.

(модератор) выделено: viewtopic.php?p=72568#p72568


Последний раз редактировалось Евгений Темиргалеев Среда, 09 Май, 2012 10:44, всего редактировалось 2 раз(а).
инф. о переносе; уд. ссылка (п. 1.2)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 11:52 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1918
Откуда: Красноярск
Info21 писал(а):
Пож., суммируйте суть в двух словах, раз уж Вы продрались сквозь альтернативные истерики.
Если создать расширяемый тип и два потомка, то в секции WITH, отвечающей за обработку конкретного потомка переменной, невозможно присвоить этой переменной указатель на другого потомка, что очень правильно, так как может привести к ошибке, мы ведь в этой секции только с первым потомком собирались работать! Обычно, компилятор выдает ошибку и отказывается собирать программу. Кроме случая который нашел ilovb. Если в WITH передавать указатель через переменный аргумент отдельной функции. В этом случае компиляция происходит, но работа приложения приводит к ошибке работы с памятью. Блек бокс в конвульсиях умирает (самый страшный случай пока из которых я видел :) ... поэтому считаю резонным выдавать предупреждение, но лучше конечно, чтобы тоже запрещалась компиляция. Но я пока не умею работать с маркерами ошибок и т.п.

Вот накидал для разъяснения несколько модифицированный пример ilovb
Код:
MODULE Test2;
   IMPORT Out;

   TYPE
      R0 = POINTER TO  EXTENSIBLE RECORD END;
      R1 = POINTER TO RECORD (R0) a: ARRAY 100 OF CHAR END;
      R2 = POINTER TO RECORD (R0) END;

   VAR
      globalPointer: R0;
      r1: R1;
      r2: R2;

   PROCEDURE Print (x: R0);
   BEGIN
      IF x IS R1 THEN Out.String("R1"); Out.Ln
      ELSIF x IS R2 THEN Out.String("R2"); Out.Ln END
   END Print;

   PROCEDURE Yes*;
   BEGIN
      NEW(r1);
      globalPointer :=  r1;
      
      WITH globalPointer: R1 DO
         Print(globalPointer);
         NEW(r2);
         (* globalPointer := r2;  такую операцию собрать невозможно, выдается ошибка *)
         Print(globalPointer); globalPointer.a := "jsdfdfkjghdfkdfghkjdffhgkjdhfgkjhdfkjghdfk";
      END
   END Yes;

   PROCEDURE Not (VAR localPointer: R0);
   BEGIN
      WITH localPointer: R1 DO
         Print(localPointer);
         NEW(r2);
         globalPointer := r2; (* А такую собрать можно, и будет ошибка работы с памятью *)
         Print(localPointer); localPointer.a := "jsdfdfkjghdfkdfghkjdffhgkjdhfgkjhdfkjghdfk";
      END
   END Not;
   
   PROCEDURE CrashTest*;
   BEGIN
      NEW(r1);
      globalPointer :=  r1;
      Not(globalPointer);
   END CrashTest;

BEGIN
END Test2.

^Q Test2.CrashTest


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 12:04 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1427
Иван Денисов писал(а):
...Кроме случая который нашел ilovb...

Чтобы исключить недоразумения и ради справедливости хочу сказать следующее:
На сколько я знаю эту ошибку когда-то обнаружил trurl.
Сергей Губанов привел пример кода, когда эта ошибка возникает. А я уже немного модифицировал его, чтобы показать к чему это может привести.

Ошибку в компиляторе, из-за которой не выводилось предупреждение обнаружил Kemet


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 15:18 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Ох уж этот Trurl...

Он, вроде, давным-давно эти ошибки указал (там была ещё одна как минимум; даже кажется в своих лекциях об этом рассказывал).

Как совершенно справедливо заметил И.Е., ошибки этого рода настолько экзотичны, что нужно иметь поистине фантазийный стиль программирования, чтобы в них вляпаться.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 17:05 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 226
Указанная Трурлем ошибка, о которой я помню: Как испортить память, не используя SYSTEM, никакого отношения к WITH не имела. Может кто-то еще помнит, где обсуждались проблемы с WITH?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 22:07 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4404
Откуда: Россия, Орёл
Вы не про это?
Peter Almazov писал(а):
Вы почитайте диссертацию Шиперски, там есть вещи и похуже. Например, в операторе WITH есть дефект. Там не гарантируется сохранность указателя, у которого уже определили тип, внутри тела WITH. Стр. 210:
Код:
TYPE
  P = POINTER TO R;   
  R = RECORD END;   
  P1= POINTER TO R1;   
  R1 = RECORD (R) x: INTEGER END;   
PROCEDURE F;   
  VAR p:P; p1:P1;   
  PROCEDURE G;   
  BEGIN NEW(p) END G;   
BEGIN NEW(p1);p:=p1;   
  WITH p: P1 DO   
    p.x:=0;  (*legal, since p has been   guarded to P1 *)
    G;       (*this destroys the assertion of the WITH guard*)   
    p.x := 42 (*havoc!!*)   
  END   
END F;

P.S. В Обероне-07 WITH убран.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Воскресенье, 06 Май, 2012 22:14 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 524
Откуда: Москва
Евгений Темиргалеев писал(а):
Вы не про это?
Peter Almazov писал(а):
Из архива достать изволили?
Так может и удалять не надо было?

(модератор) Нарушение п. 2.2. правил. Временная блокировка на 1 сут.


Последний раз редактировалось Евгений Темиргалеев Понедельник, 07 Май, 2012 15:22, всего редактировалось 1 раз.
пометка о нарушении правил


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 05:39 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Peter Almazov писал(а):
Вы почитайте диссертацию Шиперски
Питер, мои комплименты.
Уважаю которые первоисточники читают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 10:33 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2395
Откуда: Россия, Ярославль
Евгений Темиргалеев писал(а):
P.S. В Обероне-07 WITH убран.

а в реализации GPCP внутри WITH поля записи становятся read-only


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 13:28 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 398
ilovb писал(а):
Иван Денисов писал(а):
Ошибку в компиляторе, из-за которой не выводилось предупреждение обнаружил Kemet

Это не ошибка - с учетом того, что данный код тянется с древнего OberonV4 ( а может еще раньше), в котором, однако, при компиляции подобно кода, честно сообщаеся о возможных проблемах, а в ББ это сообщение скрывается, а значит и СОЗНАТЕЛЬНО скрывается наличие уязвимости.
А западенцы-потребители так любят судитья по любому поводу...

В то-же время это проблема конкретной реализации WITH, а не языка. Дыра не в WITH, а в голове у того, кто пишет такой дефективный код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 15:12 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1157
Откуда: Tel-Aviv
Kemet писал(а):
В то-же время это проблема конкретной реализации WITH, а не языка. Дыра не в WITH, а в голове у того, кто пишет такой дефективный код.
Поэтому возникает вопрос: почему ББ оберегает программиста от его ошибок (не даёт выстрелить себе в ногу или голову), а в некоторых случаях таки нет? Чем этот случай уникален с точки зрения разработчиков ББ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 16:09 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Надо бы этот диспут в отдельную тему.
Или опять начнётца латратус?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Понедельник, 07 Май, 2012 16:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1918
Откуда: Красноярск
По моему мнению, это недостаток компилятора, который должен быть устранен. Например, выдаваться сообщение об ошибке, как в случае с обычным WITH без переменного аргумента в функции и блокироваться компиляция ошибочного кода. КП — не дает ничего, что касается памяти, на откуп программиста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Красноярская сборка BlackBox 1.6rc6
СообщениеДобавлено: Среда, 09 Май, 2012 21:37 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 226
Евгений Темиргалеев писал(а):
Вы не про это?

Именно про это, спасибо!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Май, 2012 22:28 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 226
На самом деле пример из диссертации Шиперски не приводит к крэшу в ББ: если бы G создавала пойнтер типа P, то да присваивание p.x := 42 обрушило бы ББ. Но внутри WITH G на самом деле создает пойнтер типа P1 и присваивание работает без проблем. Правда после выхода из WITH поле p.x становится недоступным. Что происходит с p.x непонятно: либо после выхода из WITH соотв. память освобождается, либо происходит утечка памяти. Вполне возможно, что проблема порчи памяти в этом примере действительно существовала в предыдущих версиях Оберона, но похоже, что в ББ авторы постарались ее по крайней мере обезвредить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Май, 2012 23:36 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Давайте уж и конструктивный ответ сообразим:

Пусть VAR t: POINTER TO Type;
и у Type есть расширения Type1 ...
и есть VAR t1: Type1 ...

Возникнет ли проблема в такой конструкции:

IF t IS Type1 THEN
t1 := t(Type1);
(* работаем с t1; подмена ссылки t не меняет ссылки t1 *)
ELSIF t IS Type2 THEN
t2 := t(Type2);
...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Май, 2012 07:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4404
Откуда: Россия, Орёл
Info21 писал(а):
Давайте уж и конструктивный ответ сообразим:
На мой взгляд, Вирт решил проблему исключением WITH, потому, что между им и этой конструкцией ни в исходном ни в результирующем коде разницы почти нет. А язык с компилятором заодно несколько упрощаются.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Май, 2012 08:24 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Info21 писал(а):
Давайте уж и конструктивный ответ сообразим:
На мой взгляд, Вирт решил проблему исключением WITH, потому, что между им и этой конструкцией ни в исходном ни в результирующем коде разницы почти нет. А язык с компилятором заодно несколько упрощаются.
Это понятно.

Мне важно убедиться, что приведённая конструкция решает задачу (я сейчас сильно вне контекста, поэтому боюсь промахнуться в какой-нибудь детали).

------
В итоге рекомендация: просто не использовать WITH.

------
И мораль: WITH -- пример поспешной оптимизации.
В экстазе творчества, видя, как здорово получается, потеряли бдительность и пропустили этого симпатичного, как оказалось, таракана :)

------
Можно ещё добавить, что WITH вылазит, видимо, крайне редко.
И не характерен для стиля, когда ООП интерпретируется как специфический способ расслоения функциональности между модулями в настоящих модульных системах.

Ставлю ссылку на Смысл ООП, и туда сейчас пару слов тоже.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 11 Май, 2012 21:55 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Бессодержательный офтоп Kemet'а вместе с реакциями на него был удален по моей просьбе.

Уже были и Флейм, и Опять двадцать пять, и в тысяча двадцать пятый раз разводить латратус на темы вокруг да около никакого смысла нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Май, 2012 01:12 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 226
Info21 писал(а):
В итоге рекомендация: просто не использовать WITH.

Кстати у Шиперски первым шло предложение запретить использовать WITH только с указателями.


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 1


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

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