OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 04 Июль, 2020 01:10

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 13 Март, 2020 02:07 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 392
Откуда: Украина, Днепропетровская обл.
Недавно пробежало в voc-сообществе. Сходу мне это видится как серьёзная проблема, которая не имеет простого решения. Притом присущая всем реализациям Оберона. И конечно же эта проблема есть и в BlackBox.

Norayr Chilingarian писал(а):
i think we have to add a warning (because as i understand it is not required to throw an error by oberon report) for this case, when returning a pointer to a local variable:
Код:
MODULE test;
IMPORT Out;
TYPE
  arr    = ARRAY 16 OF CHAR;
  string = POINTER TO arr;

PROCEDURE str(): string;
VAR
  a: arr;
  s: string;
BEGIN
  a := "aaa";
  s^ := a;
  RETURN s;
END str;

PROCEDURE main;
VAR st: string;
BEGIN
  st := str();
  Out.String(st^); Out.Ln;
END main;
it happens when main is called and Out.String is called with the s^ which points to the unexisting location in the stack segment. therefore - segmentation fault, it tried to access memory it should not.

what i thought is - I would like to make a warning at the line

RETURN s;

because s is a pointer to variable allocated on stack.
when we get out of that function stack pointer changes back. and the memory pointer points to is inaccessible

so Oberon pointer should only point to the area allocated on heap with NEW, and that kind of error I wanted to illustrate is not possible in Oberon.

on the other hand, should we make a warning when there is an assignment to an unallocated pointer?

I will try several compilers, and will think of solutions.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 13 Март, 2020 07:36 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 926
Откуда: Казань
Если s указатель и NEW не вызывали, то при разыменовании должен произойти HALT.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 13 Март, 2020 10:43 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2347
Откуда: Россия, Томск
Верно, Rifat. В строке "s^ := a" s - это локальная переменная, которая равна NIL. Соответственно, при разыменовании "s^" должно произойти исключение.
В остальном же, это только на тривиальном примере легко увидеть, что возвращается указатель на локальную переменную. В общем случае это совсем не простая задача.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 13 Март, 2020 12:33 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1092
Откуда: Киев
Oleg N. Cher писал(а):
Сходу мне это видится как серьёзная проблема, которая не имеет простого решения. Притом присущая всем реализациям Оберона. И конечно же эта проблема есть и в BlackBox.

Тем не менее, есть воплощения, которые для данного случая выдают сообщение об ошибке или предупреждение. И, конечно же, BlackBox тоже это умеет:
Код:
PROCEDURE str(): string;
VAR
  a: arr;
  s|never set|: string;
BEGIN
  a := "aaa";
  s^|used before set| := a;
  RETURN s;
END str;

Неудобно то, что такой анализ нужно запускать отдельно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 13 Март, 2020 14:11 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9269
Откуда: Россия, Орёл
Да, там в исходном посте (который voc) автор не понимает семантики. Что там никакого взятия указателя нет.
Но есть другая ошибка.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

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


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

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