首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rust漫画 #3 | 二次元 Rust Meetup 讨论会:Rewrite it in Rust 是否有害?

“这里其实没有什么理想解决方案,在 Android 里 Rust 给 Cpp 端共用 Arc 做法就是直接通过 C-ABI 给 Cpp 透出函数来增减引用计数,而非这种 drop 方式。...from_raw_parts 等不安全函数重建了 Rust slice 类型。...空指针访问:FFI 函数没有充分校验指针参数是否 null 就直接解引用,可能导致空指针访问错误。...Rust端细化类型系统(refinement type system) 这个类型系统 Unsafe FFI 函数添加细化类型注解,确保 Rust 端编写 FFI 代码进行了必要安全检查。...进行了封装,充分考虑 Rust 和 C FFI 边界安全条件,进行了安全抽象,对外只提供 Safe Rust API ,从而形成 kernel-rs。

41310

先别急着“用Rust重写”,可能没有说那么安全

Rust 和 C 间不匹配,往往导致 FFI 边界处出现大量不安全代码——这令开发者很难安全将组件移植 Rust 形式。...该函数会以不安全方式从原始指针重建 Arc 引用并立即将其删除,从而减少引用计数。更重要是,这个函数期望计数 1(即调用方副本),所以如果使用得当,这个函数应该会同时删除指针引用对象。...但 Rust 并未为此提供任何特殊支持,因此实际效果完全取决于开发者是否在代码强制执行安全保障。 例如,rusTLS 会通过 ffi_panic_boundary!...不安全函数存在,导致安全责任从编译器被转移给开发者,需要独立于应用程序之外重新设计这些接口,从而满足接口内必须包含关键假设。...然而,大多数此类假设(例如指针生命周期、所有权和边界等)都无法在运行时上验证,Rust 也不提供检查所需构造函数,因此 FFI 函数会以隐含方式信任调用方并假设输入有效。

34330
您找到你想要的搜索结果了吗?
是的
没有找到

PHP FFI:一种全新PHP扩展方式

是的,FFI提供高级语言直接互相调用,而对于PHP来说,FFI让我们可以方便调用C语言写各种库。...但总还是有一些学习成本,而有FFI以后,我们就可以直接在PHP脚本调用C语言写函数了。 而C语言几十年历史,积累了大量优秀库,FFI直接让我们可以方便享受这个庞大资源。...1,但在libcurl其实并没有直接返回字符串能力,而是提供一个WRITEFUNCTION函数,在有数据返回时候,libcurl会调用这个函数....目前我们并不能直接把一个PHP函数作为函数通过FFI传递给libcurl, 那我们会有俩种方式来做: 采用WRITEDATA, 默认libcurl会调用fwrite作为函数,而我们可以通过WRITEDATA...函数,因为在PHP FFI,就目前版本(2020-03-11)我们没有办法直接获得一个函数指针,所以我们定义这个函数,返回own_writefunc地址。

1.1K30

【Rust 基础篇】Rust FFI:连接Rust与其他编程语言桥梁

为了实现跨语言互操作性,Rust提供"FFI(Foreign Function Interface)",允许Rust代码与其他编程语言进行交互。...} 在上述例子,我们使用extern "C"声明了一个外部函数my_function,并在函数体内实现函数逻辑。...注意事项 在使用Rust FFI时,需要注意以下几点: 4.1 安全性 使用Rust FFI时需要特别小心,确保调用函数安全,不会导致未定义行为或内存安全问题。...使用unsafe关键字时,需要仔细检查代码,确保所有的不安全操作都是正确。 4.2 ABI兼容性 在使用Rust FFI时,需要注意平台和编译器ABI兼容性。...需要确保在跨语言调用中正确处理生命周期和所有权关系,避免出现悬垂引用和数据竞争等问题。 结论 Rust FFIRust代码与其他编程语言交互提供便利方式。

49630

Rust FFI 编程 - 手动绑定 C 库入门 05

本篇目标如下: 被函数在 C 端,接收一个函数指针作为函数,并调用; 主函数在 Rust ,在 Rust 调用 C 端这个函数; 在 Rust ,传递一个 Rust 定义函数,到这个...C 端函数作为函数。...为什么要研究跨 FFI 函数,因为 有可能想在底层事件(异步)框架,注册一个函数,事件触发时候,调用; 底层采用注册一个路由表形式,在程序开始时候,注册一堆函数操作进去; 其它。...这是 Rust 给我们提供强大基础设施,不然我们真要愁眉苦脸。...就这样,我们就实现函数,更新外部结构体。达成我们理想要求。 总结 在本篇,我们研究 Rust 与 C 如何跨 FFI 边界实现函数调用,以及在更新外部数据。

1.4K40

听GPT 讲Deno源代码(3)

UnsafeCallbackResource:这个结构体用于保存 JavaScript 函数信息,包括函数指针和函数数据类型,用于后续传递给 JavaScript 运行时。...RegisterCallbackArgs:这个结构体用于注册函数参数,包含函数指针和数据类型等信息。...RegisterCallbackArgs 用于注册函数参数,包括函数指针和数据类型等信息,以便将 Rust 函数注册 JavaScript 可调用函数。...这些结构体主要用于实现 Rust 和 JavaScript 互操作,使得可以在 Rust 调用 JavaScript 函数,并提供一些参数和信息传递机制。...WebSocketUpgrade结构体具有以下几个主要功能: 升级到WebSocket握手操作:它提供一个upgrade函数,用于根据给定请求和用户自定义握手处理程序,将HTTP请求升级WebSocket

11310

Rust FFI 编程 - Rust 语言层面对 FFI 支持

Rust 语言主要在关键字和标准库两个方面对 FFI 提供支持,具体如下: 关键字 extern 属性 #[no_mangle] 外部块 ExternBlock 及其属性 link 和 link_name...extern "C" { #[link_name = "c_function_name"] fn name_in_rust(); } 外部块声明函数在 Rust 代码不安全,因为其他语言不会强制执行...标准库 在实际开发 Rust 语言与其它语言相互调用程序时,会遇到需要相互传递参数情况。Rust 标准库std::os::raw 和std::ffi 这两个模块提供这方面的支持。...2.1 std::os::raw 模块 使用 FFI 进行交互代码通常会使用到 C 语言提供基本类型,标准库 std::os::raw 模块[2]提供一些类型与 C 语言定义类型相匹配,以便与...2.2 标准库 std::ffi 模块 由于 Rust 语言中字符串与 C 语言字符串不同之处,标准库 std::ffi 模块[3]提供一组实用程序,主要用于外部函数接口 FFI 绑定,以及用在与其他语言传递类

3K10

深度分析:前端后端-实现篇

Rust 代码会利用设备 ID 和用户 ID(如果存在)在本地存储里查找是否有之前储存用户状态,如果有,就加载到 State ;如果没有,就创建新 State。...Swift 侧是调用方,其传递给 Rust 内存都在 withUnsafeBytes 闭,Rust 函数调用栈结束后,对该内存引用消失,所以没有内存泄漏危险,不需要手工处理。...在 on_result 调用,而这个调运行在 tokio 管理若干个线程某个,因而有可能测试线程结束时,该线程还没有结束。所以这里我们需要不那么优雅地通过 sleep 阻塞一下测试线程。...这里因为是一个 C 函数,无法做成 Rust ,因此,使用 channel 同步两个线程思路行不通。如果大家有比 sleep 更好方法,欢迎跟我探讨。...fixtures:这是一个专门提供测试所用 fixtures 库,所有的测试数据会通过 include_str! 编译到可执行文件,并提供对应函数给调用者。

1.8K10

(译)Dart2.12版本发布,可靠安全,dart:ffi正式投入生产

一个广泛目标是支持:移动设备,台式机,应用后端,等等。大量库和软件提供可在所有平台上使用一致API,从而进一步降低了创建真正多平台应用程序成本。...那是一个非常简单错误。在Google内部内部在代码早期使用null安全过程,我们发现很多复杂错误。...6.Dart生态系统安全迁移状况 在过去一年,我们提供几种声音无效安全预览版和Beta版,目的是为生态系统植入支持无效性安全软件。...我们已经发布Dart,Flutter,Firebase和Material团队提供数百个软件null安全版本。...重要是,最流行软件已首先迁移,因此,对于今天发布而言,最流行前100个软件98%,前250个顶级软件78%和前500个顶级软件57%已及时支持零安全性。

2.6K20

Rust FFI 编程 - 手动绑定 C 库入门 06

我们回顾下目标: 在 C 端有个函数,有个函数作为参数; 在 Rust 端,有个闭;并在主函数,要使用定义调用 C 端那个函数。...闭 我们知道 Rust 不仅是一个函数指针,这意味着不能使用它作为函数函数指针直接传递给 C 端。...同时我们也知道 Rust 所有的闭都实现由标准库提供 trait Fn、FnMut 或 FnOnce 一个。...具体方法就是:首先创建一个泛型 hook 函数,该函数函数参数列表一样,在其中构建并调用闭。然后创建一个 getter 函数,该函数接受闭引用作为参数,返回一个函数指针。...我们使用闭原因是需要事先定义一段代码,并在之后某个时候才实际调用它。这里我们将期望调用代码储存在 closure

1.1K20

Rust生态安全漏洞总结系列 Part 4 | 请用 time 代替 chrono

本系列主要是分析`RustSecurity` 安全数据库库[1]记录Rust生态社区中发现安全问题,从中总结一些教训,学习Rust安全编程经验。...之所以问出这个问题,是该贴作者看到 Rust 安全依赖报告显式 Chrono 有一个安全问题两年还没有被修复,所以他不知道是怎么回事。...而 libc 实现库中大多数都是直接调用 getenv 而 setenv 和 getenv 在 libc 中都不是线程安全 为了确保 setenv 健全性,Rust libstd 其添加了一个锁.../15475) 但是,直接调用 libc setenv 和 getenv 是线程不安全。...避免该漏洞有一个解决办法就是用 time 0.3 代替 chrono 最近几天 chrono 也发布一个公告:no time for chrono[7] ,主要内容是: chrono 用户可以切换到

1.2K30

Rust FFI 编程 - FFI 概述

FFI(Foreign Function Interface)是这样一种机制:用一种编程语言写程序能调用另一种编程语言写函数(routines)。 FFI 有两种内涵。...一种是是在当前正在使用语言(host),调用由其它语言(guest)提供库。第二种内涵与第一种方向相反,即,使用当前语言(host)写库,供其它语言(guest)调用。...严格来说,FFI 与 绑定,意义并不相同,绑定可以理解 FFI 一种实现。 不同语言实现 FFI 方式不尽相同。...所有的语言在编译后,都会以二进制形式去执行(即使编译后代码字节码,虚拟机在运行时候,也会继续翻译成 CPU 认识二进制指令)。这就为不同语言间调用提供可能性。 但是,可能归可能。...而不再需要单独每一个 C 库做绑定。这样就大大简化了 FFI 接口项目的编写工作。 目前这一杰出创意重量级工作成果有 cairo, pango, gtk 等库。

1K20

新版本 Redline 使用 Lua 字节码逃避检测

感染链 感染链 微软官方账户 vcpky 仓库被攻击者滥用部署恶意文件,恶意 URL https[:]//github[.]com/microsoft/vcpkg/files/14125503/...IP 地址 进一步查看,该数据传输是名为 Screen.bmp 图片文件。值得注意是,请求使用 User-Agent Winter。...PUT 请求 图片如下所示,受害者屏幕截图。 屏幕截图 字节码 字节码分析很有挑战,使用很多开源反编译器可以得到不同 Lua 脚本。...创建名为 Winter750 互斥量: 调试信息 也会使用 ntdll.dll LdrLoaddll 函数在运行时加载 dll,使用 LuaJIT ffi 调用该函数。...调试信息 使用 ffi GetComputerNameA 函数从 Windows 注册表检索 ComputerName。

9610

在 WSL 中学习 Rust ffi

通过 extern 块引入sorting.cppinterop_sort函数,并调用它: #[link(name = "sorting", kind = "static")] extern "C"...C 并没有等价于 Rust slice 类型,原因在于如果我们传递 slice,那么在 C/C++ 中就很容易访问超过数组长度内存,造成内存不安全问题。...不过在实践,应该划分模块,只允许确认过 内存安全 safe Rust 功能跨越模块调用。 在 C/C++ 调用 Rust 接下来我们反过来互操作。...`#[no_mangle]` 关闭混淆功能以让 C 程序找到调用函数 // `extern` 默认导出 C ABI #[no_mangle] pub extern fn print_hello_from_rust.../cbin cargo: true$(CARGO_BIN) build 小结 本文通过给出两个简单示例来展示 Rust 通过 FFI 功能与 C/C++ 生态进行交互能力, 并且指出几个在实践过程容易浪费时间

1.1K21

Rust 欧洲之声|Rust 和 Cpp 互操作

由于这个原因,我们对如何为C++世界用户提供原生感觉Rust代码API有着强烈兴趣。 Slint可以(选择性地)利用现有的C++代码来整合到不同操作系统环境。...如果Rust编译器已经确保执行内存安全所需所有属性得到满足,那么代码就是安全。由于Rust编译器无法解析C++代码并检查其中属性,所有的C++代码根据定义都是不安全。...这并不意味着 "不安全 "C++代码会触发未定义行为或做无效内存访问,只是说它可能会。 在这篇文章,你不需要了解Rust,但你会遇到一个概念是Rust宏。它们与C语言宏不同。...最小共同点是C外部函数接口(FFI),它提供一个稳定二进制接口,但它也将接口限制在可以用C编程语言表达范围内。...也有其他crate,它们要么建立在cxx之上,要么提供类似的功能。 cxx 承诺安全和快速绑定。 安全性只限于绑定本身。通过这些绑定调用代码当然还是不安全

3.1K21

从 QuickJS 到 Dart VM:稿定跨端渲染工程运行时演化

Dart FFI[7] 我们提供直通原生动态库函数符号能力,可以极大优化调用原生 API 时性能。它此前长期处于 beta 状态,并在前不久正式随 Flutter 2.0 进入稳定。...它允许 Dart 对象外挂一个由 void* 指针指向任意 C++ 对象,并在 Dart 对象被 GC 时,执行用于销毁(析构)该 C++ 对象函数(Finalizer)。...(Object) 是该函数从 Dart 侧所见类型 // Void Function(Handle, Pointer) 是 FFI 库声明类型 // FFI Handle 类型对应...对于 Dart FFI 接入应用,这里列出一些令人印象较为深刻注意事项: 如果想在 C++ 侧同步调用 Dart 函数,我们方式是先建立一个用于「接收 Dart 函数 C++ 函数,然后在...另外特别感谢同为国人研发 Dart Native[16] 项目,它在我们遇到 FFI 问题时提供重要帮助。 推荐阅读 ? 移动端 JS 引擎哪家强?美国硅谷找...... ?

2.4K31

rust + gnome.gtk 实现【图形用户界面】版

【回答结果】通过最后一个【函数第二个实参输入形参,以json字符串形式异步地传出。 【问卷配置】以json字符串形式从第一个形参questions传入。...”问题;后者“剩者”立足点是:“足够地快+内存安全”,解决“小康”问题。...eval 在运行时,根据上下文,求值【问卷配置】when表达式。“给表达式求值”功能真像javascript里eval函数,但没那么强大。...但是,【函数钩子】那块,我是实在抄袭不来,原因包括: 第一,我自己不会做定制而精简“脚本程序”词法分析与执行器。 第二,集成JavascriptCore引擎又太重。...另一方面,作为对缺失【函数钩子】补偿,我在如下几处添加了新配置属性: 给"type": "input"类型(即,文本输入框)添加了"subType": "port"子类。

1.7K10

绕过Disable Functions来搞事情

Disable Functions 为了安全起见,很多运维人员会禁用PHP一些“危险”函数,例如eval、exec、system等,将其写在php.ini配置文件,就是我们所说disable_functions...,特别是虚拟主机运营商,为了彻底隔离同服务器客户,以及避免出现大面积安全问题,在disable_functions设置也通常较为严格。...HTTP协议是浏览器和服务器中间件进行数据交换协议,浏览器将HTTP头和HTTP体用某个规则组装成数据,以TCP方式发送到服务器中间件,服务器中间件按照规则将数据解码,并按要求拿到用户需要数据...首先我们使用FFI::cdef()函数在PHP声明一个我们要调用这个C库函数以及使用到数据类型,类似如下: $ffi = FFI::cdef("int system(char* command...调用PHP源码函数 其次,我们还有一种思路,即FFI可以直接调用php源码函数,比如这个php_exec()函数就是php源码一个函数,当他参数type3时对应着调用是passthru

4.3K40

FFI】N-APIJS堆对象生命周期管理

其 被保存于JS VM堆内存,和 被Rust栈内存napi_ref可修改原始指针引用。即,addon端Rust程序拿到是指向“智能指针”“指针”。...因为缺乏js垫片程序协同呼应,几个Rust宏也只是杯水车薪,能“糖”内容很少。 转移更多精力从【业务逻辑实现】至【FFI编程】,并与各种FFI技术细节做“斗争”。赶快补课内存布局理论知识去吧!...具体地讲,在Rust - WASM程序上下文中,披上了“智能指针”马甲JS堆对象几乎完全“化”。@Rustacean 可忽视JS VM垃圾收集器干扰和: static全局缓存JS堆对象。...相对FFI函数单次调用执行周期,缩短JS堆对象生命周期 另一方面,N-API没有功能面面俱到垫片程序。...入口函数main()模仿JS程序调用Rust-FFI函数napi_export_method()。 “二段式”引用计数优化方案裨益 【程序性能】将FFI调用次数减少至一个常量3。

19210
领券