OberonCore
https://forum.oberoncore.ru/

Возврат указателя на локальную переменную
https://forum.oberoncore.ru/viewtopic.php?f=127&t=6585
Страница 1 из 1

Автор:  Oleg N. Cher [ Пятница, 13 Март, 2020 02:07 ]
Заголовок сообщения:  Возврат указателя на локальную переменную

Недавно пробежало в 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.

Автор:  Rifat [ Пятница, 13 Март, 2020 07:36 ]
Заголовок сообщения:  Re: Возврат указателя на локальную переменную

Если s указатель и NEW не вызывали, то при разыменовании должен произойти HALT.

Автор:  Александр Ильин [ Пятница, 13 Март, 2020 10:43 ]
Заголовок сообщения:  Re: Возврат указателя на локальную переменную

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

Автор:  Comdiv [ Пятница, 13 Март, 2020 12:33 ]
Заголовок сообщения:  Re: Возврат указателя на локальную переменную

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 ]
Заголовок сообщения:  Re: Возврат указателя на локальную переменную

Да, там в исходном посте (который voc) автор не понимает семантики. Что там никакого взятия указателя нет.
Но есть другая ошибка.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/