Инъекции: ret и call

Подменить возврат текущей функции; вызвать функцию прошивки и получить результат.

с 0.3.0

Методы

ЭлементСигнатураДоступен сAPI 3
retret(value=None) -> dict0.3.0без изменений
callcall(function, *args, this=None, signature=None, timeout=None) -> dict0.3.0await в async; timeout=

Изменения 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

Фрагменты показывают отклонённые или нежелательные приёмы, а не рабочий рецепт.

Фрагменты для тела сценария; символы прошивки условные.

← ПроверкиВсе группыТочки →