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

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

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

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

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

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

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

相关·内容

数据库系统存储与恢复方法

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

96430

数据库系统存储与恢复方法

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

1.4K00
  • 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.4K20

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

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

    65130

    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] ,对应此案例,并且有修复示例。

    92820

    编写Windows x64shellcode

    在堆栈推送和弹出数据将使用64位而不是32位 召集会议 另一个重要区别是调用函数方式,即调用约定。 以下是我们需要了解最重要事情: 前4个参数放在堆栈。...在任何调用指令之前,堆栈必须是16字节对齐。为此,一些函数可能在堆栈分配40个(0x28)字节(4个寄存器为32个字节,8个字节用于将堆栈与先前用法对齐 - 堆栈返回Rip地址)。...有些寄存器是,而另一些是非。这意味着如果我们将一些设置到寄存器并调用某些函数(例如Windows API),则寄存器可能会改变,而非寄存器将保留它们。...xor eax,eax - 将EAX(或RAX)设置为0,因为它将是main返回。 add rsp,28 - 清除分配堆栈空间。 ret - 主要归来。...我们在RBX仍然有kernel32.dll基地址(这是一个非寄存器,这就是使用它原因)所以它很简单: ; 调用GetProcAddress(kernel32.dll,“ExitProcess”

    1.5K40

    volatile相关知识

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

    60140

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

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

    4.8K30

    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.2K10

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

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

    65420

    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端枚举】之间整数类型一致

    49220

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

    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 特点 用电信号读写 擦除:在写入新数据之前,

    74530

    译文: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 通常会提供下列两项周期校准流程。

    83720

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

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

    79420

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

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

    62130

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

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

    1.6K70

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

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

    3.4K40

    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!

    79340

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

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

    32110

    计算机硬件知识

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

    58620
    领券