💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 70 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 6 из 25
На каком правиле держится поведение этого кода? Выберите основное правило раздела «Стек C API».
C Lua · Стек C API · разбор 1 Копировать
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Наблюдаемый результат в разделе «Стек C API» опирается на правило: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
Наблюдаемый результат в разделе «Стек C API» опирается на правило: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Наблюдаемый результат в разделе «Стек C API» опирается на правило: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.
Наблюдаемый результат в разделе «Стек C API» опирается на правило: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Наблюдаемый результат в разделе «Стек C API» опирается на правило: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Вопрос 7 из 25
Где этот код может повести себя иначе на границе? Нужен отрицательный сценарий для раздела «Стек C API».
C Lua · Стек C API · разбор 2 Копировать
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Для раздела «Стек C API» отдельным тестом подтверждают: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Для раздела «Стек C API» отдельным тестом подтверждают: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
Для раздела «Стек C API» отдельным тестом подтверждают: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.
Для раздела «Стек C API» отдельным тестом подтверждают: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Для раздела «Стек C API» отдельным тестом подтверждают: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Вопрос 8 из 25
Какое правило должно остаться наблюдаемым после правки? Выберите гарантию, определяющую раздел «Стек C API».
C Lua · Стек C API · разбор 3 Копировать
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Новая реализация раздела «Стек C API» обязана соблюдать: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.
Новая реализация раздела «Стек C API» обязана соблюдать: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Новая реализация раздела «Стек C API» обязана соблюдать: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Новая реализация раздела «Стек C API» обязана соблюдать: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Новая реализация раздела «Стек C API» обязана соблюдать: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
Вопрос 11 из 25
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Выберите основное правило раздела «Регистрация функций».
C Lua · Регистрация функций · разбор 1 Копировать
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
static int l_scale(lua_State *L) {
double factor = lua_tonumber(L, lua_upvalueindex(1));
double value = luaL_checknumber(L, 1);
lua_pushnumber(L, value * factor);
return 1;
}
/* registration pushes factor, then lua_pushcclosure(L,l_scale,1) */
Для фрагмента из раздела «Регистрация функций» верно: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке.
Для фрагмента из раздела «Регистрация функций» верно: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference.
Для фрагмента из раздела «Регистрация функций» верно: Ошибки Lua пересекают границу C через longjmp-подобный механизм.
Для фрагмента из раздела «Регистрация функций» верно: Хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Для фрагмента из раздела «Регистрация функций» верно: Защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Вопрос 13 из 25
После рефакторинга тесты должны защищать одно правило. Какое? Нужен основной контракт раздела «Регистрация функций».
C Lua · Регистрация функций · разбор 3 Копировать
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
static int l_scale(lua_State *L) {
double factor = lua_tonumber(L, lua_upvalueindex(1));
double value = luaL_checknumber(L, 1);
lua_pushnumber(L, value * factor);
return 1;
}
/* registration pushes factor, then lua_pushcclosure(L,l_scale,1) */
Контракт рефакторинга раздела «Регистрация функций»: Хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Контракт рефакторинга раздела «Регистрация функций»: Ошибки Lua пересекают границу C через longjmp-подобный механизм.
Контракт рефакторинга раздела «Регистрация функций»: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference.
Контракт рефакторинга раздела «Регистрация функций»: Защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Контракт рефакторинга раздела «Регистрация функций»: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке.
Вопрос 16 из 25
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Нужна именно центральная гарантия раздела «Обработка ошибок».
C Lua · Обработка ошибок · разбор 1 Копировать
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
Resource *r = open_resource();
if (luaL_loadfile(L, path) != LUA_OK) { close_resource(r); return fail(L); }
if (lua_pcall(L, 0, 0, 0) != LUA_OK) { close_resource(r); return fail(L); }
close_resource(r);
Для фрагмента из раздела «Обработка ошибок» верно: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Для фрагмента из раздела «Обработка ошибок» верно: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.
Для фрагмента из раздела «Обработка ошибок» верно: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Для фрагмента из раздела «Обработка ошибок» верно: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
Для фрагмента из раздела «Обработка ошибок» верно: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Вопрос 18 из 25
Какое правило должно остаться наблюдаемым после правки? Нужен основной контракт раздела «Обработка ошибок».
C Lua · Обработка ошибок · разбор 3 Копировать
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
Resource *r = open_resource();
if (luaL_loadfile(L, path) != LUA_OK) { close_resource(r); return fail(L); }
if (lua_pcall(L, 0, 0, 0) != LUA_OK) { close_resource(r); return fail(L); }
close_resource(r);
В разделе «Обработка ошибок» нельзя потерять правило: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
В разделе «Обработка ошибок» нельзя потерять правило: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
В разделе «Обработка ошибок» нельзя потерять правило: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
В разделе «Обработка ошибок» нельзя потерять правило: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.
В разделе «Обработка ошибок» нельзя потерять правило: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Вопрос 21 из 25
Почему этот фрагмент ведёт себя именно так? Нужна именно центральная гарантия раздела «Ошибки интеграции».
C Lua · Ошибки интеграции · разбор 1 Копировать
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_ref);
lua_pushlightuserdata(L, context);
int rc = lua_pcall(L, 1, 0, 0);
/* callback_ref and context must outlive this call */
Центральный механизм раздела «Ошибки интеграции»: Хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Центральный механизм раздела «Ошибки интеграции»: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке.
Центральный механизм раздела «Ошибки интеграции»: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference.
Центральный механизм раздела «Ошибки интеграции»: Защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Центральный механизм раздела «Ошибки интеграции»: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Вопрос 22 из 25
Первый пример подтверждает основной путь. Что проверить отдельно? Выберите именно проверяемую границу раздела «Ошибки интеграции».
C Lua · Ошибки интеграции · разбор 2 Копировать
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_ref);
lua_pushlightuserdata(L, context);
int rc = lua_pcall(L, 1, 0, 0);
/* callback_ref and context must outlive this call */
Скрытая граница раздела «Ошибки интеграции» проявляется так: Ошибки Lua пересекают границу C через longjmp-подобный механизм; защищённый вызов нужен там, где хост должен вернуть управление и освободить собственные ресурсы.
Скрытая граница раздела «Ошибки интеграции» проявляется так: Lua C API работает через индексируемый стек: каждая функция обязана знать число входов и выходов, проверять типы и восстанавливать баланс стека на всех ветвях.
Скрытая граница раздела «Ошибки интеграции» проявляется так: Типичные ошибки интеграции — устаревший индекс после push/pop, ссылка на уничтоженный userdata и забытый registry reference; их предотвращают маленькие обёртки и проверки стека.
Скрытая граница раздела «Ошибки интеграции» проявляется так: lua_State хранит стек выполнения и связанную среду; хост обязан определить владельца и синхронизацию, поскольку один state не становится потокобезопасным автоматически.
Скрытая граница раздела «Ошибки интеграции» проявляется так: Нативную функцию регистрируют как lua_CFunction и возвращают число результатов, оставленных на стеке; upvalue регистрации удобны для контекста, но их жизненный цикл должен быть безопасен.