"Обрезка" (ограничение) компилируемого кода.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

"Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 30.07.2021 21:47:00

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

допустим:
Код: Выделить всё
function(Button: byte): Boolean;
begin
  if Button > 3 then
  begin
    Result := false;
    Exit;
  end;
  // рабочий код
end;

и как раз хочу избавиться от данного If, так как по коду понятно, что больше трёх кнопок не должно просто обрабатываться, и не должно компилироваться ни как. пользователя просто предупреждаем об ошибке, что вышли за рамки значений.
предоставляет ли FPC подобную возможность?
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Сквозняк » 31.07.2021 10:01:26

Ну у тебя и запросы - компилятор уже и логические ошибки должен за тебя обрабатывать. Если бы всегда было ясно, какое число впихнут в функцию, то можно было создать массив с длиной от 0 до 3 и впихнуть аргумент в индекс чтобы вызвать ошибку в твоей проверке. Но ведь при компиляции не всегда можно узнать какое число будет в переменной - может его из файла во время работы программы прочитают - как при компиляции тогда угадывать значение :mrgreen: Так что пиши проверки на все случаи жизни и не мучайся, особенно все деления на предмет деления на ноль.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение DedFrend » 31.07.2021 12:14:44

Тяжелое наследие работы с интерпретаторами
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 31.07.2021 13:45:53

DedFrend, практически ни когда не использовал интерпретаторы (по крайней мере старался). Просто надо знать полный код, а не основываться на том коде, что дан для примера.
В компилируемых языках это называется предварительной компиляцией. Когда идёт проверка предварительная определённых данных.

Сквозняк, да хотел как лучше... :D но думаю просто без проверки обойдусь, кину в код предупреждение к функции, вылетит у пользователя ошибка, будет более-менее понятно, куда рыть. Там всё равно статические данные будет использоваться, в данном случае статический массив, что приведёт к выходу за пределы в любом случае.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Ichthyander » 31.07.2021 14:33:08

Код: Выделить всё
function(Button: byte): Boolean;
begin
  if Button > 3 then
    Exit(False); // так ИМХО красивше
  // рабочий код
end;

По сути вопроса: никак. И непонятно зачем
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 31.07.2021 14:53:21

Ichthyander, чтоб не лепить лишний код, и в случае ошибки, пользователь понимал, что с кодом не так.
Одно дело, я делаю программу для себя и мне наплевать, где что выходит за рамки, сам себя я в эти рамки поставлю, а другое, когда я делаю не только для себя. Либо проводить все исключения, либо ограничить возможность компиляции (что по сути возможно, если самому делать предварительную компиляцию, заставлять каждого пользователя пользоваться предварительной компиляцией? :mrgreen: ).
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Ichthyander » 31.07.2021 15:19:44

Если это какая-то библиотека или другой код, который будут использовать и другие программисты, то может просто использовать raise, генерацию исключений? В этом случае будет генерироваться исключение со своей собственной нужной ошибкой. К примеру, сообщение: "Button больше 3 невозможен" и класс можно создать свой на основе EException. И там либо не обрабатывается ошибка и тогда выскакивает сообщение с ошибкой. Либо дальше перехватывается исключение вышестоящим по стеку кодом и принимается решение по месту, что делать
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение runewalsh » 31.07.2021 16:54:56

С добрым утром.
Код: Выделить всё
type
   ButtonEnum = (Right, Left, Up, Down); // или, без {$scopedenums} — с префиксами: Button_Right и т. д.
   // или
   ButtonCode = 0 .. 3;
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 01.08.2021 00:37:11

runewalsh, спокойной ночи.

Я думаю надо внимательно читать вопрос, а не писать явные ответы, которые не нужны.
Специально, для тех кто не понял, что я хочу, постараюсь расписать.

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

Чего хотел я? Я хотел, чтоб пользователь использовал переменные/константы, только в определённом диапазоне, и при выходе из диапазона, чтоб код не компилировался и выдавал ошибку, ещё на стадии компиляции, а не на стадии работы приложения (что произойдёт, когда в функцию попадёт значение вне диапазона).

По сути, на это можно было бы вообще "забить", если бы библиотека не предназначалась для динамического использования. Мы скомпилируем DLL/SO и будем получать вылет из программы, и вероятнее всего вообще без всяких предупреждений.

Решением может быть предварительная компиляция приложения и проверка есть такие места или нет. Либо при создании динамической библиотеки, вставлять дополнительные проверки диапазона (что правильно).

Но я то хочу, чтоб пользователь и не мог сделать этот "баг" и чтоб проверок не было (чтоб они были предварительными).

Окончательно получаем, либо пишем все проверки диапазонов, либо пишем дополнительный компилятор, который будет делать эти проверки по обязаловке... :mrgreen:
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Сквозняк » 01.08.2021 01:11:57

Seenkao писал(а):но думаю просто без проверки обойдусь,

А вот это зря - программа должна работать, а лишняя проверка ничего в твоём коде заметно не затормозит.

Добавлено спустя 12 минут 28 секунд:
Ещё можно запилить включаемую отладку, когда при возникновении таких ошибок сделаются проверки возможности создания файла лога, и если создание возможно, он создаётся и процедуры в него строчат жалобы на предмет пихания в них невпихуемого. Очень важно провести проверку возможности создания файла, потому что бывает, что при невозможности попытка создания производит критическую ошибку в программе. Также имя файла лога и его путь должны быть изменяемыми.

Добавлено спустя 11 минут 8 секунд:
Также можешь прикрутить к записи в лог озвучку:
- Эй, чё пихаешь, самка собаки? Ай, айяяй!
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 01.08.2021 01:54:56

Сквозняк писал(а):А вот это зря - программа должна работать, а лишняя проверка ничего в твоём коде заметно не затормозит.

и да и нет. Тут палка о двух концах. Когда код вызываемой процедуры достаточно мал его можно встраивать в вызываемый код (inline). А используя проверки, от встраиваимости надо избавляться, что автоматически повышает нагрузку на код в 2-3 раза. В нынешних реалиях это конечно "копейки", но думаю не стоит забывать, что таких вызовов может происходить несколько сотен в секунду, а возможно и несколько тысяч...

Но писать прекомпилятор... тоже желания большого нет. Это же надо так же будет писать среду разработки, чтоб пользователя не заставлять лишние телодвижения делать (и вообще, это уже вообще совершенно другая разработка, требующая достаточно немало времени).

Сквозняк писал(а):Ещё можно запилить включаемую отладку

Это конечно хорошо... но... тут тоже спорный вопрос. Конечный код не должен содержать отладочную информацию.
Получается, отладка нагрузит работу программы, но если в это время она с графикой не работает, то вполне можно (напоминаю, я не отказываюсь! Я рассуждаю :D ). Надо рассмотреть все плюсы и минусы.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Сквозняк » 01.08.2021 03:16:17

Seenkao писал(а):Когда код вызываемой процедуры достаточно мал его можно встраивать в вызываемый код (inline).

Это у тебя такие корявые проверки из-за следования пути математиков визжащих об ужасном гото. Вот так всё замечательнее:
Код: Выделить всё
function rgbhnrhtgf(Button: byte): Boolean;
label
100:
begin
Result := false;
if Button > 3 then goto 100;
//и ещё куча проверок посылающих на сотую метку,
//номер которой обычно используешь на выходе процедур и функций

  // рабочий код
Result := true;
100:
end;


Seenkao писал(а): Конечный код не должен содержать отладочную информацию.


Тут уже решаешь, или сопли всем разработчикам вытирать, или писать быстрые непрожорливые программы.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 01.08.2021 14:42:22

Сквозняк писал(а):ужасном гото.

Я пользуюсь им. ))) Но в данном варианте, это одно и то же.

Сквозняк писал(а):Тут уже решаешь, или сопли всем разработчикам вытирать, или писать быстрые непрожорливые программы.

делема...

Проверил, при выходы за параметры, функция срабатывает и ни каких ошибок не выдаёт... значит надо делать эти проверки... фигово...
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Сквозняк » 01.08.2021 22:15:00

Seenkao писал(а):значит надо делать эти проверки... фигово...

Ну кто бы подумал что проверки нужны :mrgreen:
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: "Обрезка" (ограничение) компилируемого кода.

Сообщение Seenkao » 08.08.2021 02:59:18

Сквозняк писал(а): сопли всем разработчикам вытирать

Решил: "вытру". И заставлю себя в очередной раз перелопачивать весь код, на данные проверки. А так же введу дополнительное ллогирование.

А "для себя" сделаю возможность отключения этого ллогирования. Ну не только для себя, но по сути, когда будет готова конечная программа и в логах не будет исключительных ситуаций, значит в конечной программе можно будет отключить дополнительную информацию.

Твою дивизию... я задолбался с этими исключениями... :evil: почему всё из воздуха не происходит? :mrgreen:
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru