Есть ли альтернатива compile_error на основе статического анализа (например, оптимизатором) - PullRequest
2 голосов
/ 27 сентября 2019

У меня есть функция с именем foo.

fn foo(val: bool) {
   if val {
      panic!("This should not ever happened");
   } else {
      // do something useful
   }
}

// somewhere else
foo(true); // this should cause compile error

. Я хочу остановить сборку, если компилятор будет уверен, что функция foo будет вызываться со значением true.Я хочу получать информацию как можно скорее (поэтому время компиляции лучше времени выполнения).Поэтому я хочу что-то вроде compile_error! но на основе статического анализа.Абсолютно нормально скомпилировать его, если компилятор не уверен, будет ли вызвана ветка true или нет - программа будет паниковать во время выполнения.

compile_error!, к сожалению, для меня непригодна, потому что я не хочуследующий код не удалось при компиляции

if false {
   compile_error!("Some error");
}

1 Ответ

1 голос
/ 27 сентября 2019

Это невозможно с compile_error!.Макрос оценивается задолго до того, как происходит оптимизация кода.В основном только два контекста, в которых compile_error! сейчас полезен:

  • Условная компиляция с #[cfg(...)]
  • Макросом, генерирующим код, который может содержать compile_error!

Оба из них оцениваются до появления ошибки compile_error!.

Нет приятных функций, позволяющих вам делать то, что вы хотите достичь.Тем не менее, существует своего рода взломать .Он используется no-panic crate и вызывает ошибку во время соединения (то, что вы обычно видите довольно редко в Rust).

Трюк работает, вставляя ссылку на неизвестный символ в каждом месте паники.Если оптимизатор (который выполняется очень поздно в конвейере компиляции, но все еще в основном перед связыванием) может удалить ветвь, ведущую к panic, он также удаляет ссылку на неизвестный символ.Если оптимизатор не может удалить ветвь, то окончательный код содержит ссылку на этот неизвестный символ, и компоновщик выдаст ошибку «неопределенная ссылка на ...».Это нехорошая ошибка, но она останавливает компиляцию программы.

Ваша цель немного более сложна: вам нужна ошибка, только если компилятор уверен, что паника обязательно произойдет.Это более сложно, но вы также можете использовать этот хак для его решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...