Компилятор перестал разрешать неопределённые символы в WebAssembly — опечатки теперь видны при сборке

04.04.2026

rustc больше не передаёт линковщику 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