Rustbindgen вызывает ошибку «недействительный идентификатор» при сборке

Кто-нибудь знает, как начать отладку этой проблемы с отступами привязки Rust?

stderr thread 'main' panicked at '"vpx_codec_ctx_union_(unnamed_at_/usr/include/vpx/_/vpx_codec_h_206_3)" is not a valid Ident', /home/ignis/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-1.0.59/src/fallback.rs:811:9

Это ссылка на эту часть заголовка libvpx:

      /*!\brief Codec context structure
 *
 * All codecs \ref MUST support this context structure fully. In general,
 * this data should be considered private to the codec algorithm, and
 * not be manipulated or examined by the calling application. Applications
 * may reference the 'name' member to get a printable description of the
 * algorithm.
 */
typedef struct vpx_codec_ctx {
  const char *name;             /**< Printable interface name */
  vpx_codec_iface_t *iface;     /**< Interface pointers */
  vpx_codec_err_t err;          /**< Last returned error */
  const char *err_detail;       /**< Detailed info, if available */
  vpx_codec_flags_t init_flags; /**< Flags passed at init time */
  union {
    /**< Decoder Configuration Pointer */
    const struct vpx_codec_dec_cfg *dec;
    /**< Encoder Configuration Pointer */
    const struct vpx_codec_enc_cfg *enc;
    const void *raw;
  } config;               /**< Configuration pointer aliasing union */
  vpx_codec_priv_t *priv; /**< Algorithm private storage */
} vpx_codec_ctx_t;

Я вижу много ответов в Интернете, в которых говорится о занесении этих типов в черный список, но я не могу внести это в черный список, поскольку необходим тип контекста. Похоже, тип объединения вызывает проблемы...

Обновление: найдена соответствующая часть документации vpx-sys: https://docs.rs/env-libvpx-sys/5.1.2/vpx_sys .

Похоже, автор библиотеки смог сгенерировать привязки...

1 ответ

Это тревожный код:

      pub(crate) fn is_ident_start(c: char) -> bool {
    c == '_' || unicode_ident::is_xid_start(c)
}

pub(crate) fn is_ident_continue(c: char) -> bool {
    unicode_ident::is_xid_continue(c)
}

fn validate_ident(string: &str, raw: bool) {
    if string.is_empty() {
        panic!("Ident is not allowed to be empty; use Option<Ident>");
    }

    if string.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
        panic!("Ident cannot be a number; use Literal instead");
    }

    fn ident_ok(string: &str) -> bool {
        let mut chars = string.chars();
        let first = chars.next().unwrap();
        if !is_ident_start(first) {
            return false;
        }
        for ch in chars {
            if !is_ident_continue(ch) {
                return false;
            }
        }
        true
    }

    if !ident_ok(string) {
        panic!("{:?} is not a valid Ident", string);
    }

    if raw {
        match string {
            "_" | "super" | "self" | "Self" | "crate" => {
                panic!("`r#{}` cannot be a raw identifier", string);
            }
            _ => {}
        }
    }
}

Это просто проверка наличия в идентификаторах допустимых символов. В этом случае,((и я подозреваю/) являются недопустимыми символами.

Так почему же это происходит? Взгляните на сообщение об ошибке:"vpx_codec_ctx_union_(unnamed_at_/usr/include/vpx/_/vpx_codec_h_206_3)" is not a valid Ident

Все в(unamed...)часть не должна была дойти до этой стадии. Выполняя поиск, мы находим здесь проблему с ржавчиной-bindgen, которая ссылается на коммит libclang, вызвавший изменение .

В частности, этот коммит был для Clang 16. Поэтому либо понизьте Clang до версии до 16, либо обновите свой контейнер привязки до версии 0.62.0 или выше (именно тогда было применено исправление).

Другие вопросы по тегам