Что означает «ловушка» по отношению к целочисленному недостаточному потоку/переполнению?

#integer #integer-overflow #motoko #internet-computer

Вопрос:

Чтение документов для Мотоко интернет-компьютера:

https://sdk.dfinity.org/docs/languages/motoko-at-a-glance.html#_bounded_numbers_trapping

Я понял, что у меня нет хорошей модели для того, что здесь означает слово «ловушка».:

Ограниченные числа (захват) Nat8, Nat16, Nat32, Nat64, Int8, Int16, Int32, Int64

ловушка на избыточном и недостаточном потоке

необходимо указать аннотации типов

литералы: 13, 0xf4, -20, 1_000_000

Означает ли это, что целое число останется фиксированным на максимуме/минимуме, если попытка записать число, которое вызовет переполнение/недостаточный поток?

Каково происхождение слова «ловушка» в этом контексте? И каково здесь его точное значение?

Ответ №1:

Ловушка в этом контексте приводит к прерыванию выполнения. Канистра по-прежнему будет в порядке, но вызов, сделанный канистре, завершится неудачей. См.Эту часть руководства.

В качестве демонстрации я настроил контейнер счетчика с типом Nat8 из одного из этих шаблонов, поэтому он должен поддерживать значения 0..255 включительно, и инициализировал его до 250:

 $ cat counter-canister/main.mo 
actor {
    stable var currentValue: Nat8 = 250;

    public func increment(): async () {
        currentValue  = 1;
    };

    public query func getValue(): async Nat8 {
        currentValue;
    };
};
 

Затем я нажал кнопку «увеличить». Он увеличился с 250 до 255, как и ожидалось, затем при следующем щелчке это появилось в консоли браузера:

 vendor.e49a5b15.js:831 Uncaught (in promise) Error: Call was rejected:
  Request ID: 0f549a49b80b31831e423196d086e36c12df51896ffaaa59e99bae7fa66047aa
  Reject code: 5
  Reject text: Canister ryjl3-tyaaa-aaaaa-aaaba-cai trapped explicitly: arithmetic overflow

    at pollForResponse (vendor.e49a5b15.js:831)
    at async n (vendor.e49a5b15.js:838)
    at async HTMLButtonElement.n (index.4a11dcea.js:5)
 

Перезагрузка страницы показала, что значение по-прежнему было максимальным-255.

Канистра по-прежнему полностью функциональна. Если бы я потрудился также поместить туда кнопку уменьшения, я мог бы немного сократить время, а затем увеличить значение, пока снова не достигну предела.