【问题标题】:rust-bindgen bindings raise SIGSEGVrust-bindgen 绑定引发 SIGSEGV
【发布时间】:2019-01-23 03:36:28
【问题描述】:

我使用rust-bindgen 工具生成了与Microsoft SEAL C++ Library 的绑定。

我的配置:

// Generate the bindings
let bindings = bindgen::Builder::default()
    .generate_inline_functions(true)
    .derive_default(true)
    .header("./seal/src/seal/seal.h")
    .clang_arg("-I./seal/src/")
    .clang_arg("-std=c++17")
    .clang_arg("-x")
    .clang_arg("c++")
    .opaque_type("std::.*")
    .whitelist_type("seal::.*")
    .whitelist_function("seal::.*")
    .generate()
    .expect("Unable to generate bindings");

SEAL 项目是使用cc-rs 使用此配置编译的:

let mut build = cc::Build::new();                
    build.cpp(true);                                 
    build.flag_if_supported("-std=c++17");           
    build.flag_if_supported("-march=native");        
    build.flag_if_supported("-fkeep-inline-functions");                                                   
    build.flag_if_supported("-fno-inline-functions");
    let base_path = Path::new("./seal/src/seal/");   
    let util_base_path = Path::new("./seal/src/seal/util/");                                              
    add_cpp_files(&mut build, base_path);            
    add_cpp_files(&mut build, util_base_path);       
    build.include("./seal/src");                     
    build.compile("seal"); 

但之后,当使用 static 方法创建新上下文(这主要是 SEAL 特定的)时,我遇到了分段错误(SIGSEGV:无效引用),这是我在使用 @987654328 调试后发现的@ 来自于复制指向内存池的指针。

我能够实例化多个常规对象(没有静态构造函数的东西),但无论我尝试什么参数,它似乎都不适用于 SEALContext。

您可以访问我的项目seal-rs here。整个过程都在构建脚本中并克隆了 repo,因此 cargo test 应该构建并重现错误。

我的操作系统是 Archlinux 64bit,使用的编译器是 clang 7。

【问题讨论】:

  • 问题应该自己包含回答问题的所有内容,到 github 的链接是不够的。如果因为它太大而无法包含它,您的问题太宽泛,请使用minimal reproducible example
  • 我不希望有人真正构建这个东西。我认为具有 bindgen 经验的人能够告诉我是否缺少标志。我会注意的。
  • bindgen 与 C++ 不完全兼容,还要注意 bindgen 做“最好的客人”,C 或 C++ 标准中没有指定很多东西,所以很多东西可能是错误的.
  • 布局测试可能会失败,但库会编译。您可以通过传递正确的标志来生成没有布局测试的绑定。
  • 自动生成的测试全部通过。这是一个使用失败的绑定的自定义测试。

标签: c++ rust bindgen


【解决方案1】:

这是由 rust-bindgen 库中的错误引起的,因此我将关闭问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2021-09-15
    • 2023-02-24
    • 2021-09-19
    • 2020-05-12
    • 1970-01-01
    • 2022-01-23
    • 2018-08-27
    相关资源
    最近更新 更多