【发布时间】:2026-02-15 18:20:03
【问题描述】:
我们讨论了如何确保某些共享(不受信任)内存区域中的数据只被访问一次,复制到本地内存,然后从那里检查和处理。环境是一个嵌入式多核 µC,带有用于 IPC 的共享 RAM,代码是用 C99 编写的。
目前我们基本上是做Type local_copy = *(Type*)shared_memory_pointer;,之后只对local_copy进行操作。
现在一位同事提出了一个问题,是否允许编译器不执行复制到本地内存,而是直接在下面访问shared_memory_pointer 处的数据,这(理论上)将允许操作数据使用时。
编译器有可能做到这一点吗?如果是这样,我们如何确保它不会发生?如果不是,请详细说明。
谢谢大家!
编辑:有问题的核心上没有操作系统,它是一个裸机系统。
【问题讨论】:
-
instead access the data at shared_memory_pointer directly in the following, which (in theory) would allow for manipulation如何使用副本操作数据?then only operate on local_copy afterwards无论编译器做什么,都不能改变你的代码——如果你对一个副本进行操作并更改一个副本,它不会影响原始代码。对共享指针的访问可能是读取,而不是写入。 -
@KamilCuk 他询问编译器是否可以优化掉副本。我认为,添加一些
volatilevoodoo 可以防止这种情况发生。 -
@KamilCuk 我认为允许编译器重新加载
shared_memory_pointer,只要它可以证明两者之间的任何操作都不会影响存储在shared_memory_pointer中的值 -
我认为您必须使用一些原子操作来加载值。喜欢
atomic_load。这将防止编译器重新排序操作或拆分负载。 -
Type local_copy = *(Type*)shared_memory_pointer;之类的代码是代码异味,强烈表明您的程序中有未定义的行为或其他类型相关的错误。