Компилятор перестал разрешать неопределённые символы в WebAssembly — опечатки теперь видны при сборке
04.04.2026rustc больше не передаёт линковщику WebAssembly флаг --allow-undefined на всех платформах WebAssembly. Неопределённый символ теперь даёт ошибку линковки, как и на любой нативной платформе.
Что происходило раньше
Допустим, программа вызывает функцию из внешней библиотеки на C. Если имя в объявлении ошибочно или нужный крейт забыли указать в зависимостях, ошибки не возникало. Неопределённый символ превращался в импорт из модуля с именем env в готовом файле.
Дальше всё зависело от того, что окажется в этом модуле при запуске. Ошибка появлялась в браузере и выглядела как невнятное сообщение о неразрешённом спецификаторе модуля — без указания на то, что произошло при сборке.
Чем это плохо
Формулировка разработчиков точная: банка отложенной проблемы уезжает дальше по цепочке, увеличивая расстояние между местом обнаружения и местом, где ошибка появилась. На нативных платформах неопределённый символ считается ошибкой по умолчанию, и передача этого флага вводила на WebAssembly неожиданное поведение.
Как пережить
Если проект намеренно отдавал символы хост-окружению через модуль env, это надо объявить явно — атрибутом #[link(wasm_import_module = "env")] на блоке с символами либо флагом линковщика.
Всем остальным готовиться к тому, что опечатки в именах внешних символов и забытые зависимости станут видны на этапе сборки. Это хорошо.
Ломается немногое: неразрешающийся импорт всё равно не запустился бы. Изменение пришло в ночные сборки и включено в Rust 1.96.
Оригинал
Changes to WebAssembly targets and handling undefined symbols от 4 апреля 2026 года; rust-lang/rust#149868
Упоминаний: 1 · Просмотров: 2