use-after-free of `proc_macro` symbol, Rust

a marqué ce sujet comme résolu.

Bonjour, j’ai eu cette erreur :

error: proc macro panicked
  --> src/main.rs:16:5
   |
16 |     load_extension_parser!(B);
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: message: use-after-free of `proc_macro` symbol

Je ne sais pas pourquoi cela fait cett erreur mon main.rs :

use extension_popper::load_all_extension_parser;
use popper;
use popper::extension::ExtensionParser;
use popper::parser::Parser;
use popper::ast::expr::{Expr, ExprType};

#[extension_parser(B)]
fn a(parser: &mut Parser) -> Expr {
    Expr::new(Box::new(ExprType::Eof), 0..1, String::new())
}



fn main() {
    load_extension_parser!(B);
    B.parse(&mut popper::parser::Parser::new(Vec::new(), String::new()));
}

mon macro:


#[proc_macro_error]
#[proc_macro]
pub fn load_extension_parser(item: TokenStream) -> TokenStream {
    let mut input = parse_macro_input!(item as Ident);
    unsafe {
        if EXTENSIONS.contains(&input) {
            return TokenStream::from(quote! {
                let mut parser = popper::parser::Parser::new();
                parser.add_extension(Box::new(&mut #input));
            })
        } else {
            panic!("Extension not found");
        }
    }

}

si quelqu’un pouvait m’aider ce serait sympa

+0 -0

Salut,

Il sort d’où le module popper ? Je le trouve pas sur crates.io et une recherche google donne rien de pertinent à part la même question que tu as posée sur stackoverflow…

+0 -0

Ah, je vois. Le dépôt github m’éclaire pas des masses cela dit parce qu’il n’a pas les mêmes objets que ce que tu nous présentes dans ton code partiel, donc on peut pas recoller les morceaux. En gros il faudrait qu’on soit à même de compiler ton code pour pouvoir t’aider correctement.,

Si je demande, c’est parce qu’il y a plusieurs choses qui m’interpellent dans ton code et qu’il faut comprendre avant de pouvoir debugger.

  • Déjà, l’éléphant dans le magasin de porcelaine est le bloc unsafe qui prend quasiment tout le corps de la macro sans commentaire associé. Donc là on sait pas quel morceau est effectivement unsafe, et encore moins quels sont les invariants associés, et donc encore moins comment tu t’es assuré qu’ils sont vérifiés… (En principe, tout ça devrait être dans un commentaire SAFETY, mais bon).
  • Le item as Ident est un peu curieux aussi (mais je sais pas ce que parse_macro_input! est sensé faire…), si tu ne prends que des Ident de toute façon, tu ne peux pas t’en sortir avec une macro_rules! ?
  • Le EXTENSIONS dans le bloc unsafe attise aussi ma curiosité, parce qu’il semblerait que tu vérifies la présence de l’identifiant passé à la proc-macro dans une variable statique (?), et j’ai peur de comprendre que celle-ci serait enrichie par la macro extension_parser (ce qui n’est pas possible, les macros ne peuvent pas conserver un state en Rust).

Bref, comme tu peux voir ton code n’est pas très explicite par lui-même et soulève pas mal de questions… Ça va être difficile de t’aider si on n’a pas toutes les informations pour pouvoir compiler.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte