Инъекции: ret и call
Подменить возврат текущей функции; вызвать функцию прошивки и получить результат.
Методы
Изменения API 3 (0.5.0)
call в async — await; timeout= ограничивает вызов (0.5.0). ret не исполняет тело функции.
Правильно
После ret продолжите до обработки возврата и проверьте потребление, пропущенные эффекты и следующий вход (пример tests/controlled-input). Readback SRAM не доказывает потребление. Для буфера: пакет в буфере опыта, call через Pointer с точной длиной, порядок, отказ, повторный вход и следующий штатный пакет (tests/buffer-consumption). ret проверяет реакцию вызывающего кода; call — с явным таймаутом. В кандидате 0.6.0 namespace/static требуют единственного символа; A4.2 допускает явный this и точную signature; A4.3a — Pointer/Reference с проверкой типов и SRAM. A4.3b корректирует this/Pointer/Reference к однозначной невиртуальной базе по DWARF; при преобразовании Pointer count=1. Сравните адрес подобъекта с независимым эталоном. Count не ограничивает тело функции. Сначала outcome/return_state, затем return_value; логическое время задаётся аргументом.
t.reach("sample_input")
result = t.ret(1)
t.check("forced", result["outcome"], "forced")
t.reach("after_processing") # Caller must run before checking consumption.
t.check("caller consumed the value", t.read("input_state.consumed"), 1)
value = t.call("app_checksum", 7, timeout=2) # async def: await t.call(...)
t.check("returned", value["outcome"], "returned")
t.check("value available", value["return_state"], "available")
t.check("checksum(7)", value["return_value"], 22)
# Separate tests/logical-time ELF: ticks are not host seconds.
t.reach("ready")
t.call("start", 100, 10, timeout=2)
result = t.call("poll", 110, timeout=2)
t.check("returned", result["outcome"], "returned")
t.check("value available", result["return_state"], "available")
t.check("DONE", result["return_value"], 2)Не рекомендуется
Вызов внутри выражения отклоняется; вызов без таймаута ограничен только лимитом сценария. ret не восстанавливает прерванный call. Программная подмена не доказывает физическое нажатие или отказ периферии. Запись буфера без вызова — не потребление; вызов обработчика не проверяет DMA и прерывание.
t.check("DONE", t.call("poll", 110), 2) # dict is not the returned number
t.read("app_checksum(7)") # refused: expression_call_forbidden
t.call("app_wait_forever") # no timeout: only the scenario limit stops it
t.call("app_log", "text") # string argument: unsupported_argument
t.call("demo::overloaded", 1) # ambiguous_function, no overload guessing
t.call("Probe::add", 1) # unsupported_method: explicit this is requiredФрагменты показывают отклонённые или нежелательные приёмы, а не рабочий рецепт.
Фрагменты для тела сценария; символы прошивки условные.