Страница 1 из 2

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

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

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

и как раз хочу избавиться от данного If, так как по коду понятно, что больше трёх кнопок не должно просто обрабатываться, и не должно компилироваться ни как. пользователя просто предупреждаем об ошибке, что вышли за рамки значений.
предоставляет ли FPC подобную возможность?

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

СообщениеДобавлено: 31.07.2021 10:01:26
Сквозняк
Ну у тебя и запросы - компилятор уже и логические ошибки должен за тебя обрабатывать. Если бы всегда было ясно, какое число впихнут в функцию, то можно было создать массив с длиной от 0 до 3 и впихнуть аргумент в индекс чтобы вызвать ошибку в твоей проверке. Но ведь при компиляции не всегда можно узнать какое число будет в переменной - может его из файла во время работы программы прочитают - как при компиляции тогда угадывать значение :mrgreen: Так что пиши проверки на все случаи жизни и не мучайся, особенно все деления на предмет деления на ноль.

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

СообщениеДобавлено: 31.07.2021 12:14:44
DedFrend
Тяжелое наследие работы с интерпретаторами

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

СообщениеДобавлено: 31.07.2021 13:45:53
Seenkao
DedFrend, практически ни когда не использовал интерпретаторы (по крайней мере старался). Просто надо знать полный код, а не основываться на том коде, что дан для примера.
В компилируемых языках это называется предварительной компиляцией. Когда идёт проверка предварительная определённых данных.

Сквозняк, да хотел как лучше... :D но думаю просто без проверки обойдусь, кину в код предупреждение к функции, вылетит у пользователя ошибка, будет более-менее понятно, куда рыть. Там всё равно статические данные будет использоваться, в данном случае статический массив, что приведёт к выходу за пределы в любом случае.

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

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

По сути вопроса: никак. И непонятно зачем

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

СообщениеДобавлено: 31.07.2021 14:53:21
Seenkao
Ichthyander, чтоб не лепить лишний код, и в случае ошибки, пользователь понимал, что с кодом не так.
Одно дело, я делаю программу для себя и мне наплевать, где что выходит за рамки, сам себя я в эти рамки поставлю, а другое, когда я делаю не только для себя. Либо проводить все исключения, либо ограничить возможность компиляции (что по сути возможно, если самому делать предварительную компиляцию, заставлять каждого пользователя пользоваться предварительной компиляцией? :mrgreen: ).

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

СообщениеДобавлено: 31.07.2021 15:19:44
Ichthyander
Если это какая-то библиотека или другой код, который будут использовать и другие программисты, то может просто использовать raise, генерацию исключений? В этом случае будет генерироваться исключение со своей собственной нужной ошибкой. К примеру, сообщение: "Button больше 3 невозможен" и класс можно создать свой на основе EException. И там либо не обрабатывается ошибка и тогда выскакивает сообщение с ошибкой. Либо дальше перехватывается исключение вышестоящим по стеку кодом и принимается решение по месту, что делать

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

СообщениеДобавлено: 31.07.2021 16:54:56
runewalsh
С добрым утром.
Код: Выделить всё
type
   ButtonEnum = (Right, Left, Up, Down); // или, без {$scopedenums} — с префиксами: Button_Right и т. д.
   // или
   ButtonCode = 0 .. 3;

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

СообщениеДобавлено: 01.08.2021 00:37:11
Seenkao
runewalsh, спокойной ночи.

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

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

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

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

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

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

Окончательно получаем, либо пишем все проверки диапазонов, либо пишем дополнительный компилятор, который будет делать эти проверки по обязаловке... :mrgreen:

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

СообщениеДобавлено: 01.08.2021 01:11:57
Сквозняк
Seenkao писал(а):но думаю просто без проверки обойдусь,

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

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

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

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

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

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

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

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

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

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 писал(а): Конечный код не должен содержать отладочную информацию.


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

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

СообщениеДобавлено: 01.08.2021 14:42:22
Seenkao
Сквозняк писал(а):ужасном гото.

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

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

делема...

Проверил, при выходы за параметры, функция срабатывает и ни каких ошибок не выдаёт... значит надо делать эти проверки... фигово...

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

СообщениеДобавлено: 01.08.2021 22:15:00
Сквозняк
Seenkao писал(а):значит надо делать эти проверки... фигово...

Ну кто бы подумал что проверки нужны :mrgreen:

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

СообщениеДобавлено: 08.08.2021 02:59:18
Seenkao
Сквозняк писал(а): сопли всем разработчикам вытирать

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

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

Твою дивизию... я задолбался с этими исключениями... :evil: почему всё из воздуха не происходит? :mrgreen: