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

有没有办法从稳定的Rust上的未对齐地址中读取易失性值?

从稳定的Rust上的未对齐地址中读取易失性值是不安全的,因为Rust语言对于未对齐的内存访问是未定义行为。未定义行为意味着编译器和运行时环境可以自由地执行任何操作,包括崩溃、产生错误的结果或者其他无法预测的行为。

Rust语言的设计目标之一是提供内存安全和数据竞争的保证。为了实现这一目标,Rust在编译时会进行严格的内存访问检查,包括对内存对齐的要求。未对齐的内存访问可能会导致数据损坏或者安全漏洞。

如果需要从未对齐地址中读取易失性值,可以考虑使用C或C++等语言来实现。这些语言对于未对齐的内存访问通常具有定义明确的行为。然而,需要注意的是,这种做法可能会导致可移植性和安全性问题。

总结起来,从稳定的Rust上的未对齐地址中读取易失性值是不推荐的做法,因为它违反了Rust语言的内存安全保证。在Rust中,应该遵循内存安全的最佳实践,以确保代码的可靠性和安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

非易失性数据库系统存储与恢复方法

摘要 非易失性内存的出现从根本上改变了数据库管理系统的内存和持久存储的架构。这些新型NVM设备具有堪比DRAM的速度,但是写到NVM设备后这些数据就具备了持久性。...和非易失设备不同,数据库管理系统可快速从易失的DRAM上读写数据,但是一旦断电,这些数据就会丢失。 另外,有一些固有的物理限制阻止DRAM容量扩展超出今天的水平。...这就确保元组字节对齐,能够很方便计算出记录偏移。表大于8字节的字段存储到变长slot中,slot的8字节地址存储到tuple的字段域中。 这些block中的元组无序。...如果不能确保这个顺序,那么在系统重新启动后引擎不能回收未提交事务所消耗的存储空间,从而导致非易失性内存泄漏。在事务的所有更改都安全地保留后,引擎会截断日志。...但WAL的目的不是重建MemTable,而是从MemTable中撤销(undo)未提交事务的影响。表2显示了NVM-Log引擎执行的操作的概况。

1.4K00

非易失性数据库系统存储与恢复方法

非易失性数据库系统存储与恢复方法 摘要 非易失性内存的出现从根本上改变了数据库管理系统的内存和持久存储的架构。这些新型NVM设备具有堪比DRAM的速度,但是写到NVM设备后这些数据就具备了持久性。...和非易失设备不同,数据库管理系统可快速从易失的DRAM上读写数据,但是一旦断电,这些数据就会丢失。 另外,有一些固有的物理限制阻止DRAM容量扩展超出今天的水平。...这就确保元组字节对齐,能够很方便计算出记录偏移。表大于8字节的字段存储到变长slot中,slot的8字节地址存储到tuple的字段域中。 这些block中的元组无序。...如果不能确保这个顺序,那么在系统重新启动后引擎不能回收未提交事务所消耗的存储空间,从而导致非易失性内存泄漏。在事务的所有更改都安全地保留后,引擎会截断日志。...但WAL的目的不是重建MemTable,而是从MemTable中撤销(undo)未提交事务的影响。表2显示了NVM-Log引擎执行的操作的概况。

99430
  • W25Q128FV译文(二)

    7.1.6补码保护位(CMP) –易失性/非易失性可写位 补码保护位(CMP)是状态寄存器中的非易失性读/写位(S14)。...7.1.7状态寄存器保护位(SRP1, SRP0) –易失性/非易失性可写位 状态寄存器保护位(SRP1和SRP0)是状态寄存器(S8和S7)中的非易失性读/写位。...7.1.10 Quad Enable (QE) –易失性/非易失性可写位 四线式使能(QE)位是状态寄存器(S9)中的非易失性读/写位,允许四线SPI和QPI操作。...要将易失性值写入状态寄存器位,必须在写入状态寄存器(01h)指令之前发出启用易失性状态寄存器(50h)指令。...但是,由于这些位的OTP(一次性可编程)保护,SRP1和LB [3:1]不能从“1”变为“0”。 在断电或执行软件/硬件复位时,易失性状态寄存器位值将丢失,并且恢复为非易失性状态寄存器位的值。

    1.5K20

    漫谈C变量——对齐 (2)

    最后一个例子中,数组chBuffer[] 很有可能被分配在一个对齐到 word 或者 halfword 的地址上,那么 &chBuffer[1] 几乎可以肯定是一个非对齐的地址 把一个非对齐的地址传给一个默认需要对齐的函数...为了头疼医头,脚疼医脚的“屏蔽”这个Error,很多人会加入强制类型转换 (uint32_t *) 。实际上,从ANSI-C的标准来看,这个代码并没有任何问题,语法和逻辑上都讲得通。...如果操作的目标地址上是一个“易失性”的寄存器,那么非对齐的操作被拆分了以后,会导致原本的一次操作变成了连续的两次。从而对操作的内容产生破坏性的后果。...---- 注意:这里“易失性”意思就是,每次操作的时候: 要么操作本身会导致寄存器内容改变 比如,GPIO的Toggle寄存器,每次写操作都会导致对应的引脚翻转 比如,外设的中断状态寄存器,读取状态寄存器的操作本身就会清除标志...…… 要么每次读取的内容都会不同 比如, Timer计数器,每次读取的时候计数器的内容都不同 比如,ADC的采样结果寄存器,读取顺序不同,很可能每次读取时候的值都会变化 …… ---- 如果操作的目标地址由多个

    67230

    Unsafe 随堂小测题解(一)

    “本文节选自「Rust 生态蜜蜂」。Rust 生态蜜蜂是觉学社公众号开启的一个付费合集。生态蜜蜂,顾名思义,是从 Rust 生态的中,汲取养分,供我们成长。...官方给出的解释为: “健全性是一个类型系统的概念,意味着类型系统是正确的,即,类型良好的程序实际上应该具有该属性。对于 Rust 来说,意味着类型良好的程序不会导致未定义行为。...如果违反以下任何条件,则行为未定义: data 必须对读取 len * mem::size_of::() 的多个字节有效,而且必须正确对齐。...因此就存在一种可能性,传入的&T中会包含用于对齐的未初始化 padding 字节,在进行cast转换以后,data指针 也许正好会指向哪些padding字节,这个时候就是 UB。...在《Rust 编码规范》的 Unsafe Rust 编码规范部分,也包含了一条规则:P.UNS.SAS.03 不要随便在公开的 API 中暴露未初始化内存[10] ,对应此案例,并且有修复示例。

    96020

    volatile相关知识

    回答: 的易失性的关键字是类型限定符防止从编译器optimization.According至C标准的对象,具有挥发性限定类型可以以实施方式未知进行修改或具有其他未知侧effects.You也可以说,一个对象可以随时更改...如果一个对象被volatile限定符限定,那么每次程序访问它时,编译器都会从内存中重新加载该值,这意味着它阻止将变量缓存到寄存器中。从内存中读取值是检查内存的唯一方法。价值的不可预测的变化。...我们可以有一个易失性指针吗? 回答: 是的,我们可以用C语言创建一个易失性指针。 int * volatile piData; // piData是一个指向整数的易失性指针。...例如, volatile int a; 当编译器看到上述声明时,它避免对“a”做出任何假设,并且在每次迭代中从分配给变量的地址中读取值。 C中的变量可以是常量变量还是易变量?...是一个指向易失性无符号整数的常量指针,使用* pcPortReg我们可以访问内存映射寄存器。

    60940

    【译】为 嵌入式 C 程序员编写的 Rust 指南

    Rust的夜间版(Nightly)每天都从主干版(master)上切割下来;正是在夜间版上,非稳定(unstable)的功能才可以被启用。...对union变体的赋值与结构中的赋值相同,但读取变体需要使用 Unsafe 的Rust,因为编译器无法证明你没有读取未初始化的或无效的数据,所以你需要写上 unsafe { my_union.bar }...一般来说,原始指针在 Rust 中只用于指向潜在的未初始化的内存,一般表示地址,而不是实际内存的引用。为此,我们使用引用,这将在后面讨论。 当我们遇到函数时,我们将触及到函数指针。...相反,可以使用指针上的read_volatile() 和write_volatile() 方法进行易失性读取,其行为与C语言中的易失性指针转指完全相同。...注意,这些方法在比架构的易失性加载和存储更宽的类型上工作,这将扩展成一系列的易失性访问,所以要小心。同样的注意事项也适用于C语言:volatile uint64_t在32位机器上会发出多个访问。

    5.2K30

    【连载】两百行Rust代码解析绿色线程原理(五)附录:支持 Windows

    ,除了我们需要的一个文档很少记载的奇怪特性之外,Windows 只是有更多的“由被调用者保存的寄存器”,或者也有人叫它“非易失性寄存器”。...额外的由被调用方保存的(非易失性)寄存器 我提到的第一件事是 Windows 需要在上下文切换期间保存更多数据,尤其是 XMM6-XMM15 寄存器。...除了 XMM 寄存器,rdi 和 rsi 寄存器在 Windows 上也是非易失性的,这意味着它们已由被调用者保存(在Linux上,这些寄存器用于第一个和第二个函数参数),因此我们也需要添加它们。...因为 Rust 为我们设置好了栈帧,所以我们只需要关心将 %rsp 和返回地址放在哪里,这与 psABI 中的内容几乎相同。...可能的对齐问题 好的,这部分应该很难,还记得吗?Windows 从不会把事情变得太简单来让我们感到失望。你会看到,当我们从 128 位寄存器中移出数据时,我们需要使用一些特殊的汇编指令。

    66920

    Rust 1.51.0 已正式发布,及其新特性详述

    Rust,可以从 Rust 官网页面获取 rustup,并可以在 GitHub 站点查看 Rust 1.51.0 的详细发行说明。...现在使用 1.51.0,您在编程中,可对任意整数类型、布尔型(bool),或 char 类型做到泛型!(使用结构体(struct)或枚举(enum)值时,仍然不稳定。)...array::IntoIter 已稳定 作为常量泛型稳定化的一部分,Rust 团队还稳定了一个使用常量泛型特性的新 API:std::array::IntoIter,IntoIter 允许您在任何数组上创建值迭代器...值得注意的补充是稳定的 ptr::addr_of! 和 ptr::addr_of_mut!,它允许您创建指向未对齐(unaligned)字段的原始指针。...这两个宏现在允许您安全地创建未对齐(unaligned)指针。

    1.3K10

    【Rust笔记】浅聊 Rust 程序内存布局

    仅能保存于偶数位的内存地址address上。 存储宽度size也得是4字节 — 从有效长度3字节到存储宽度4字节的扩容过程被称作“对齐”。 对齐位数alignment必须是2的自然数次幂。...于是, 值的对齐位数可由std::mem::align_of_val::(&T)读取 值的存储宽度可由std::mem::size_of_val::(&T)读取 存储宽度size的对齐计算...所以,无论在联合体内声明了几个字段,都仅有一个字段值会被保存于物理存储之上。从原则上讲,联合体union的内存布局一定与占用内存最多的字段一致,以确保任何字段值都能被容纳。...从实践上讲,有一些细节处理需要斟酌: 联合体的对齐位数union.alignment等于全部字段对齐位数中的最大值(同结构体)。...又确保了【Rust端枚举类分辨因子】与【C端枚举值】之间整数类型的一致性。

    60720

    计算机组织结构(五) 内置存储器

    SRAM:Static RAM DRAM 以电容器上的电荷来存储数据 电容器中是否存有电荷被解释称二进制1和0 需要定期刷新来维持数据,因为电容器有放电的趋势 本质是模拟设备,因为电容可以存储一定范围内的任何电荷值...DRAM 和 SRAM 之间的比较 相似点: 易失.必须持续供应电力来保存位值 不同点: DRAM 比 SRAM 的单元更小且更简单,但是需要刷新电路 DRAM 比 SRAM 集成度更高,更便宜...经过一段延时后,DRAM写入或读出数据.在这段时间内,DRAM 执行各种内部功能,如激活行地址线或列地址线的高电容, 读取数据,以及通过输出缓冲将数据输出,而处理器只是等待,降低了性能....PROM Programmable ROM 特征 非易失性 可以但只能写入一次 用电信号写 需要特殊设备 与ROM相比 PROM 更灵活方便 ROM在大批量生产领域仍具有吸引力 Read-mostly...Memory 特征 读操作比写操作更为频繁 非易失性存储 类型 EPROM EEPROM Flash Memory EPROM Erasable PROM 特点 用电信号读写 擦除:在写入新的数据之前,

    77630

    译文:DDR4 - Initialization, Training and Calibration

    一般来说,在系统上电之后,ASIC/FPGA/处理器中的 DDR 控制器会被从复位状态中释放,自动执行上电与初始化序列。...运行算法,以对齐 DRAM 的时钟信号 CK 与数据有效信号 DQS 的边沿 运行算法,确定 DRAM 颗粒的读写延迟 将采样时刻移动至读取数据眼图的中央 报告错误,如果此时的信号完整性实在太差,没办法确保可靠的读写操作...DIMM 上的多个颗粒(比如下图中有 8 个)都共享同一组地址/控制信号,采用 fly-by 结构能够提高信号完整性与信号速度。...DDR 控制器 使能模式寄存器 MR3 中的 bit 2,进入 MPR 访问模式,从 MPR 而不是 DRAM 存储介质中读取数据 发起一系列读请求,此时返回的是在 MPR Pattern Write...为了确保信号完整性,以及读写的稳定性,一些在初始化阶段进行训练的参数必须重新训练更新。控制器 IP 通常会提供下列两项周期性校准流程。

    1.1K20

    【连载】两百行Rust代码解析绿色线程原理(二)一个能跑通的例子

    此代码运行的最小值是 624 字节的栈大小。如果你想要遵循这个确切的例子,代码可以在 Rust Playground 上运行(但是由于最终代码中的循环,你需要等待大概 30 秒的超时时间)。...我们写入要在新栈上运行的函数的地址。然后我们将存储此地址的第一个字节的地址传递给 rsp 寄存器(我们设置给 new.rsp 的地址值将指向 位于我们自己的栈上的地址,该地址将导致上述函数被调用)。...由于我们将地址推送到 %rsp 寄存器,因此CPU会认为它是当前运行的函数的返回地址,因此当我们传递 ret 指令时,它会直接返回到我们自己的栈中。 CPU 做的第一件事就是读取函数的地址并运行它。...由于 rsp 寄存器存储指向栈上下一个值的指针,因此我们有效地将我们提供的地址压到当前的栈上,覆盖了当前已有的值。 在普通的汇编代码中,你不会看到这样使用的 $0。...值得注意的是,我们需要为代码指定 “对齐栈(alignstack)” 才能在 Windows 上运行。

    83120

    MySQL 高扩展架构构建百万在线系统实践

    可用性 可用性这块首先要谈的就是高可用,这方面最早使用的是MHA,到了现在基本上每个公司都会维护一份自己的MHA代码,而不去直接使用官方的。...另一种方式是自主实现,基于MHA的思想,自己通过Python之类的语言实现。 再往上的服务架构上的支持,要考虑DB在故障切换中程序会不会异常,DB切换后故障,有没有备选方案。...以我们的经验来看可用性要考虑几方面的措施,包括自动化的安全阈值控制、高可用切换过程中产生的DB不可用处理、多写的机制中数据一致性是不是方便校检以及后期数据补偿方案。...易失性 Cache - Memcache - Redis 非易失性 Cache - Redis - MongoDB - MySQL NDB Cluster 比较推荐的是Redis – Cluster以及...易失性这方面则可以选择Redis,但是一定要考虑Redis挂了后,数据库能够扛的住,一般的解决方案是在发现数据库响应较慢的时候,连接层自动降级。 有问题可以在评论区讨论,以上为所有分享内容,谢谢大家!

    63130

    Excel中使用了自定义函数的单元格自动更新

    这个问题困扰我2天了,白天没有网络,只能研究帮助,从calculate研究到cache,都没有找到更好的办法。晚上在网上只花了5分钟就解决了。...原来是采用易失性函数——faint,我居然第一次听说这个名词。...帮助 Volatile 方法 用于将用户自定义函数标记为易失性函数,无论何时在工作表的任意单元格中进行计算,易失性函数都必须重新进行计算。...非易失性函数只在输入变量改变时才重新计算,若不用于计算工作表单元格的用户自定义函数中,则此方法无效。 语法 expression.Volatile(Volatile) expression   必选。...如果为 True 则将该函数标记为易失性的;如果为 False 则将该函数标记为非易失性的。默认值为 True。

    1.6K70

    Rust 安全参考 | Rust 编译到 WebAssembly 可能出现侧信道攻击

    同样,如果使用私密数据来确定从内存中的哪个位置读取,这可能会导致缓存未命中,进而影响应用程序的执行时间。在这两种情况下,有关私密数据的信息都会在程序执行期间通过时间差异泄露。...来告诉编译器 &input 的内存是易失的,编译器不应该对它做任何假设 // 起到了一个优化屏障的作用 unsafe { core::ptr::read_volatile(&input..., choice) } 从 Rust 编译到 WebAssembly 会如何?...实践证明,Turbofan 没有对 black_box 函数进行优化,由于 Wasm 中没有任何内容与 Rust 中的 volatile 读取相对应,理论上, Turbofan 没有理由继续保留 black_box...这同时也证明了,black_box中的私密值&input被泄露到了wasm内存中,这不是好现象。 如果使用 llvm_asm!

    82140

    科学瞎想系列之一一四 同步电机的功率圆图

    为了保证功角小于90度,就不得不限制有功输出,因此在纵轴的左侧画出了两条稳定极限线,其中那条“理论稳定极限线”是从理论上按最大电磁转矩对应功角画出的,而那条“运行稳定极限线”是在理论稳定极限基础上打了一定的安全裕度得到的...与横轴的左交点,也就是说,在失励情况下,定子磁场对齐交轴时,电机输出的无功功率最大。...式中:E0*为额定电压时的励磁反电势标幺值。 ⑥ 改变功角θ,使其与失励圆交点以外的线段部分的长度保持为(E0*/Xd*),则此线段另一端的轨迹即为转子电流限制线。...从O1作任意直线O1D与上述垂直线交于D点,并与失励圆交于C点。截取线段DE使之等于O1C。重复此过程所得E点轨迹即为“理论稳定极限线”。...重复此过程所得的K点的轨迹即为“运行稳定极限线”。 以上是以凸极同步电机为例介绍了功率圆的相关作图程序,由于凸极同步电机最具代表性,作图程序也最复杂,所以我们不失一般性地介绍了它的作法。

    3.7K40

    计算机硬件知识

    除了主存RAM之外,许多计算机已经在使用少量的非易失性随机访问存储如ROM(Read Only Memory,ROM),在电源切断之后,非易失性存储的内容并不会丢失,ROM只读存储器在工厂中就被编程完毕...每个磁头可以读取一段换新区域,称为磁道 把一个戈丁手臂位置上所以的磁道合起来,组成一个柱面 每个磁道划成若干扇区,扇区典型的值是512字节   数据都存放于一段一段的扇区,即磁道这个圆圈的一小段圆圈,从磁盘读取一段数据需要经历寻道时间和延迟时间...,它有底层的I/O软件,包括读键盘,写屏幕,进行磁盘I/O,该程序存放于一非易失性闪存RAM中。...易失性,断电情况下就会丢失。为存储系统主力,在高速缓存找不到的文件在内存中均能被找到。 与之相应的是ROM,非易失性,断电情况下数据也不会丢失。ROM只读存储器,在工厂已被编程完成且不能修改。...闪存速度介于RAM和磁盘中,相比较磁盘而言,闪存擦除次数过多会使其磨损,导致其功能失效。 CMOS与BIOS电池:CMOS为存储器的一种,易失性。

    60920

    【PADAUK】 应广PGS152单片机EEPROM芯片

    其中,EEPROM芯片是该单片机的一个重要组成部分,用于存储非易失性数据。在本篇文章中,我们将深入探讨PADAUK PGS152单片机EEPROM芯片的特点、应用和使用注意事项。...容量大:EEPROM芯片具有较大的存储容量,可存储大量的数据。这使得该芯片适用于需要存储大量数据的各种应用。2. 非易失性:EEPROM芯片具有非易失性特点,即掉电后数据不会丢失。...存储配置参数:EEPROM芯片可用于存储设备的配置参数,如波特率、端口号等。在设备启动时,程序可以从EEPROM中读取这些参数,从而快速配置设备。2. ...通过将数据存储在EEPROM中,开发人员可以随时读取这些数据并对设备进行相应的调整。3. 用户数据存储:EEPROM芯片也可用于存储用户数据,如设备使用记录、交易数据等。...(index pointer)6.IO地址以及存储地址空间互相独立1.

    38210

    Rust API 指南:文档

    有时,附上另一个条目的适用示例的链接可能就足够了。例如,如果恰好一个函数使用特定类型,则可以在该函数或类型上编写单个示例后,从另一个链接到该示例。 示例的目的并不总是显示如何使用该条目。.../// 从该源提取一些字节到指定的缓冲区中,返回 /// 读取了多少字节。.../// 从`src`中读取值而不移动它。这使得 /// `src`中的内存不变。.../// /// # 安全 /// /// 除了接受原始指针之外,这是不安全的,因为它在语义上 /// 将值移出src,而不阻止未来使用src。...注意,`*src = foo`也算使用 /// ,因为它将尝试把先前的值放在`*src`处。 /// /// 指针必须对齐;如果不是这种情况,请使用`read_unaligned`。

    2.1K30
    领券