Я использую Lua в среде микроконтроллера, и недавно у меня были некоторые сбои, связанные с повреждением данных кучи.
Проблема была обнаружена в следующей последовательности:
- Позвоните на
lua_pcall(L, 0, 0, 0)
без проверки возвращаемого значения.
- Вызов другой функции, снова с
lua_pcall(L, 0, 0, 0)
, на этот раз проверка возвращаемого значения.
- Шаг 2 завершается неудачно (фактически, шаг 1 не удался, но я его не поймал) и вызывает
lua_close(L)
;
- Во время
lua_close(L)
память освобождается. На этом этапе диспетчер памяти обнаруживает повреждение в куче и происходит сбой прошивки.
Я хотел бы спросить, в каких случаях состояние Lua может быть недействительным? (И, следовательно, никакие другие операции не допускаются).
- Всегда ли безопасно звонить
lua_close()
?
- В случае сбоя
lua_pcall()
разрешается ли снова использовать lua_pcall()
, вызывая другую функцию?
- В случае сбоя
lua_pcall()
с «нехваткой памяти», можно ли сделать какие-либо предположения о состоянии памяти? Можно ли тогда вызывать lua_close()
или вообще любую другую функцию Lua API?