OberonCore
https://forum.oberoncore.ru/

SIZE, SHORT и неопределённое поведение
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6257
Страница 1 из 2

Автор:  Comdiv [ Суббота, 23 Июнь, 2018 15:52 ]
Заголовок сообщения:  SIZE, SHORT и неопределённое поведение

Хочу обратить внимание на проблему.

Есть в описании языка функция SIZE, возвращающая специфичный для платформы размер типа. Сам я считаю её использование нежелательным. В конце-концов главное её предназначение в работе в связке с SYSTEM, пусть и через посреднические модули. Но выяснилось, что её активно используют в Blackbox для промышленных задач.
Цитата:
Есть какой-то тип - блок протокола, например. Простого протокола, уровня модбаса и т.п.
Код:
TYPE
   Header = RECORD
       ...
   END;
   Frame = RECORD
       ...
   END;
Мне нужно объявить буфер, способный хранить нужный мне размер.
Код:
VAR buf: ARRAY SIZE(Header) + SIZE(Frame) OF BYTE;

В то же время в сообщении о языке говорится:
Цитата:
SIZE не может применяться в константных выражениях, т.к. его значение зависит от фактической реализации компилятора.
Это означает, что поведение в подобном применением SIZE является неопределённым, с соответствующими последствиями для переносимости (не смеяться, КП можно использовать вне ББ).

Схожая проблема есть с функцией SHORT. Её могут использовать для отсечения старших разрядов, что не останавливается ББ, так как по умолчанию нет проверки диапазона.
В описании языка сказано:
Код:
Имя    Тип аргументов   Тип результата   Функция
SHORT(x)  LONGINT         INTEGER      тождество
Что не может быть выполнено при переполнении диапазона, а значит, в таком случае поведение тоже не определено.

Так как Blackbox теперь в руках сообщества, то, наверно, и Компонентный Паскаль тоже. Желательно сделать одно из двух:
1. Привести Blacbox Component Builder в состояние, в котором по умолчанию неопределённое поведение трактуется как ошибка, требующая исправления для работы приложения.
2. Привести формальное сообщение о языке к согласию с практичным применением чтобы, по крайней мере, можно было понять код, не прибегая к экспериментам с компилятором.

С точки зрения переносимости и безопасности лучше первое.

Автор:  Wlad [ Среда, 27 Июнь, 2018 01:25 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
Есть в описании языка функция SIZE
Теперь осталось внятно людЯм объяснить, ЧТО возвращает SIZE...

Автор:  Comdiv [ Среда, 27 Июнь, 2018 01:33 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

В описании сказано, что
Код:
Имя      Тип аргументов   Тип результата   Функция
SIZE(T)   любой тип      INTEGER         количество байт, требуемое для T

Не то, чтобы исчерпывающе, но интуитивно понятно.

Автор:  Wlad [ Воскресенье, 01 Июль, 2018 14:17 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
В описании сказано, что
Код:
Имя      Тип аргументов   Тип результата   Функция
SIZE(T)   любой тип      INTEGER         количество байт, требуемое для T

Не то, чтобы исчерпывающе, но интуитивно понятно.

ЧТО понятно?
ЧТО за размер возвращается?
Мы ведь уже не в мире вульгарного Си! У нас (как и во всяком языке, куда добавлен ООП) размеры экземпляров могут отличаться от тех, которые можно понять из текста описания их типа или класса...
Никаких бы проблем не возникало, если бы мне было не дозволено на низком уровне (и в обход безопасности типов) копаться в "кишках" представления класса. Но мне (по крайней мере иногда, через через атрибуты и "фокусы") ДОЗВОЛЕНО. А там пойдут вопросы - что за размер? какие смещения и соответствие порядка расположения полей тому, как было описано при декларации?...
И т.д....

Автор:  Comdiv [ Воскресенье, 01 Июль, 2018 14:28 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Wlad писал(а):
ЧТО понятно?
ЧТО за размер возвращается?
Размер, в который помещается экземпляр типа, в том числе и структуры.

Wlad писал(а):
Мы ведь уже не в мире вульгарного Си! У нас (как и во всяком языке, куда добавлен ООП) размеры экземпляров могут отличаться от тех, которые можно понять из текста описания их типа или класса...
Не знаю о чём речь. В мире "вульгарного Си" размеры экземпляров тоже могут отличаться от тех, которые можно понять из текста описания. Вплоть до растяжимого понятия байта, да и скрытые данные не запрещены.

Автор:  Wlad [ Воскресенье, 01 Июль, 2018 14:42 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
Не знаю о чём речь. В мире "вульгарного Си" размеры экземпляров тоже могут отличаться от тех, которые можно понять из текста описания. Вплоть до растяжимого понятия байта, да и скрытые поля не запрещены.

Вы говорите о различных настройках выравнивания в "вульгарном" Си. Это - единственное место "магии". Но оно - часть модели/стандарта языка и реализации компиляторов. В Си скрытые поля - лишь заполнители компилятором для выравнивания. Да и очерёдность полей в экземпляре не разнится с описанием их в исходнике.
А вот в Си-шарпе уже так утверждать - чревато.
В языках с поддержкой ООП появляются служебные поля в экземплярах. И - начинаются "нюансы" и "фокусы".
Вопрос остаётся: ЧТО возвращает SIZE? КАКОЙ размер? Нам ЭТОТ размер нужен, или, как в СИ-шарпе нужно специальный метод вызывать, типа GetSize, GetInstanceSize, GetMarshallSize и/или пристально ещё и на атрибутику типа смотреть?

ОБНОВЛЕНИЕ: А вот ещё, например в Scheme или Pharo - вообще на счёт размера экземпляра очень скользко инфу получать... Для меня, например до сих пор (просто тесно не связывался, не "прижимало" ещё) их FFI - магия.

Автор:  Comdiv [ Воскресенье, 01 Июль, 2018 15:11 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Wlad писал(а):
Вы говорите о различных настройках выравнивания в "вульгарном" Си. Это - единственное место "магии". Но оно - часть модели/стандарта языка и реализации компиляторов. В Си скрытые поля - лишь заполнители компилятором для выравнивания.
Я говорю о стандарте языка, а не о том, как оно реализовано и оптимистичную опору в программах на особенности реализации. А в стандарте всюду неопределённое поведение с трудно предсказуемыми последствиями для общего случая. Заполнители могут использоваться для чего угодно, например, распространено использование "канареек" для обнаружения нарушения памяти. Это применяется для стека, но для структур тоже не запрещено.

Реализовывают сейчас, кстати, тоже сильно по разному и в самом что ни на есть mainstream. Тот функционал, что предоставляется флагами -fsanitize=* в gcc и clang трудно обеспечить без дополнительных данных. А флаг -fsanitize-undefined-trap-on-error делает применение предыдущих флагов пригодным и для конечного продукта, а не только для отладки.

Автор:  Wlad [ Понедельник, 02 Июль, 2018 01:51 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
Я говорю о стандарте языка

Мы - всё не о том.
Необходимо ясное понимание, ЧТО за значения возвращают функции типа SIZE в современных ЯП.
Причём мне это знание нужно не для "внешнего использования" типа выделение нужного размера для коллекции, а - для "копания" в самом объекте на низком уровне. Почему-то эта инфа практически везде или завуалирована в руководствах, или - "размазана" по разным главам в них. А ведь она должна быть вся кучей вывалена (со всеми нюансами и различиями) прямо в месте первого упоминания этой функции или возможности. НЕ НАДО прятать "вычислительный базисный механизм"!

Автор:  Comdiv [ Понедельник, 02 Июль, 2018 10:26 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Можете привести пример, как могла бы выглядеть документация по SIZE? Мне пока сложно представить, что в такой документации должно быть помимо сообщения о том, что это размер типа. Если, гипотетически, уточнять описание, то неплохо бы узнать поточнее.

Автор:  Wlad [ Понедельник, 02 Июль, 2018 23:45 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
Можете привести пример, как могла бы выглядеть документация по SIZE?

Зачем же - пример вместо определения?
В Документации по SIZE необходимо указать, ЧТО за значение возвращается функцией в зависимости от разновидности типа объекта, подающегося на её вход.
То есть, будет ли размер, в случае наличия виртуальных функций в классе данного объекта, равен размеру точно такого же описания, но без виртуальных функций?

Автор:  Comdiv [ Понедельник, 02 Июль, 2018 23:54 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

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

Автор:  Илья Ермаков [ Вторник, 03 Июль, 2018 05:31 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Если вдаваться в технические детали конкретной реализации, то в КП (думаю, что и изначально у Вирта) все технические поля размещались по смещению с минусом от базового адреса объекта. Ну а уж виртуальная таблица вообще не у экземпляра, а у его дескриптора типа.

Т.е. SIZE - это чисто размер под информационные поля, с учётом выравниваний.

Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )

Автор:  Wlad [ Среда, 11 Июль, 2018 00:56 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Илья Ермаков писал(а):
Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )

В этом примере SIZE учитывает выравнивание элементов массива?
Если элементы массива содержат "служебные поля по отрицательному смещению", то они входят в размер элемента?

Автор:  Илья Ермаков [ Среда, 11 Июль, 2018 18:29 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Wlad писал(а):
Илья Ермаков писал(а):
Вариант определения SIZE:
Если считать, что конструкция VAR x: ARRAY n OF Type не имеет собственной метаинформации (а оно так и есть - размеры статически проверяет компилятор), то SIZE = размер в байтах, занимаемый массивом / n.
Хотя тоже через одно место как-то )

В этом примере SIZE учитывает выравнивание элементов массива?
Если элементы массива содержат "служебные поля по отрицательному смещению", то они входят в размер элемента?


Интересный вопрос.
Если говорить конкретно о реализационной семантике (такое вот неожиданное словосочетание) Оберона, начиная с базового и до КП, то вся служебная информация существует либо у динамического объекта (как раз по отрицательному смещению), либо известна статически компилятору, либо передаётся скрытыми параметрами процедур (в случае VAR-ссылок). Например, у записи, лежащей просто на стеке, не хранится тег типа. Когда запись куда-то передаётся по ссылке, то компилятор подставляет передачу неявным параметром тега типа (который на верхнем уровне вызова, естественно, статически известен).

Автор:  Wlad [ Среда, 18 Июль, 2018 01:22 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Илья Ермаков писал(а):
Интересный вопрос.
Если говорить конкретно о реализационной семантике ...

Спасибо за ответ, Илья.
Тишина?

Автор:  budden [ Вторник, 02 Октябрь, 2018 01:00 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Тему не читал, сразу отвечаю. А я правильно понимаю, что MAX(INTEGER) тоже зависит от реализации компилятора? Это же гораздо страшнее, чем SIZE, и низводит ваш распрекрасный КП до уровня вульгарного Си. ЕМНИП в Java всё устроено гораздо лучше в этом отношении - там типы имеют конкретный размер. В лиспе тоже лучше - там целые числа имеют неограниченную точность :mrgreen: Если уж наводить порядок, то надо начать с запрета INTEGER, вместо которого нужно ввести типы конкретной битности. В последних стандартах Си есть некоторые поползновения в этом направлении. Правда, избавиться от UB в арифметике всё равно будет тяжело. И вот вам мой тег BlackBoxComponentBuilder.

Поскольку все мои слова умножаются примерно на 1e-10, я привожу конкретнейший пример. Прибваляю я в КП к INTEGER-у 2 INTEGER 2. Ну или там 65535 + 1. Сколько получится? А хто его знает. Т.е. даже простейший калькулятор на КП написать нельзя, равно как и на Си.

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

Автор:  Info21 [ Вторник, 02 Октябрь, 2018 09:52 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

В нашем прекрасном КП размеры элементарных типов фиксированы в определении языка.

Автор:  budden [ Вторник, 02 Октябрь, 2018 11:36 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

А, нашёл, приложение C. Извините. Пожаловался на себя модератору :)

Автор:  Wlad [ Среда, 03 Октябрь, 2018 23:40 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

budden писал(а):
Тему не читал, сразу отвечаю.

Тарапыца - нэ надо, да.
Речь шла не о скалярных типах. Там - само собой, на уровне согласования с исполняющим устройством всё должно быть (ну, хотя бы, что бы арифметические вычисления производить).
А вот размеры типов-эмуляторов понятий (более) высокого уровня - вот где "нюансы"...
Ещё раз: не спешите.

Автор:  Роман М. [ Пятница, 05 Октябрь, 2018 11:19 ]
Заголовок сообщения:  Re: SIZE, SHORT и неопределённое поведение

Comdiv писал(а):
Так как Blackbox теперь в руках сообщества, то, наверно, и Компонентный Паскаль тоже.
Я думаю что это ошибочное рассуждение.

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