Добрый день!
Анализируя журнал сервера наткнулся на ошибку с текстом:
Ошибка в скрипте "MinutestoHours" в строке 4. Integer overflow
Переходим к скрипту и видим 5 строк:
begin
if Sender is TM_Text then // проверяем, что Sender это текст
with Sender as TM_Text do // приводим Sender к типу "TM_Text"
Text := SecondsToStr(AsInt*60);
end.
Согласно руководству в функции SecondsToStr аргумент является:
function SecondsToStr(ASeconds: Int64): string;
с диапазоном из руководства -9223372036854775808…9223372036854775807
Обращаем внимание, что переменную берем как AsInt с диапазоном -2147483648…2147483647
Данный скрипт применяется много где, но:
- отрицательных значений нет ни где
- везде есть значения
- самое большое 51000
Предполагаем, что именно 51000 вызывает переполнение.
Считаем
51000 * 60 = 3 060 000 что на много меньше диапазонов всех указанных типов выше.
Можете подсказать, где закралась ошибка?
Здравствуйте.
для начала нужно разделить ошибки функции и аргумента j := AsInt*60; // var j: integer;
Text := SecondsToStr(j);
Предполагаем, что именно 51000 вызывает переполнение.
"Кофейная гуща" не поможет выявить ошибку :D. Для отлова ошибок (особенно редких) можно изменить скрипт:begin
if Sender is TM_Text then // проверяем, что Sender это текст
with Sender as TM_Text do // приводим Sender к типу "TM_Text"
try
Text := SecondsToStr(AsInt*60);
except
AddMessageToGroup(now, mkAlarm, 1, 'ошибка: объект ' + Name + ' переменная '
+ Variable.Name + ' = ' + AsStr + ' * 60 = ' + IntToStr(int64(AsInt) * 60)
, true, false);
end;
end.
Сообщение об ошибке будет в журнале сервера и, в несколько более детальном виде, в выделенной группе сообщений.
Проект контроля переполнений из примера можно не подключать к БД, при просмотре группы сообщений будет выдано предупреждение, но поступающие сообщения будут отображаться.