小编JMA*_*MAA的帖子

如果单线程,可变静态基元实际上是“不安全”的吗?

我正在开发单核嵌入式芯片。在 C 和 C++ 中,静态定义可全局使用的可变值是很常见的。Rust 的等价物大致是这样的:

\n
static mut MY_VALUE: usize = 0;\n\npub fn set_value(val: usize) {\n    unsafe { MY_VALUE = val }\n}\n\npub fn get_value() -> usize {\n    unsafe { MY_VALUE }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

get_value现在任何地方都可以调用免费函数set_value.

\n

认为这在单线程嵌入式 Rust 中应该是完全安全的,但我还没有找到明确的答案。我只对不需要分配或销毁的类型感兴趣(例如此处示例中的原语)。

\n

我能看到的唯一问题是编译器或处理器以意想不到的方式重新排序访问(这可以使用易失性访问方法来解决),但这unsafe 本身就是问题就是这样吗?

\n
\n

编辑:

\n

这本书表明,只要我们能保证没有多线程数据竞争,这就是安全的(显然这里就是这种情况)

\n
\n

对于全局可访问的可变数据,很难确保不存在数据竞争,这就是 Rust 认为可变静态变量不安全的原因。

\n
\n

这些文档的措辞不太明确,表明数据竞争只是不安全的一种方式,但没有扩展到其他示例

\n
\n

访问可变静态可能会以多种方式导致未定义的行为,例如由于多线程上下文中的数据竞争

\n
\n

秘典表明,只要您不以某种方式取消引用坏指针,这应该是安全的。

\n

embedded unsafe rust

13
推荐指数
1
解决办法
5338
查看次数

如何使用auto关键字在C++中分配类型为uint32_t或uint64_t的变量

考虑auto var = 5u;.在这里,我使用后缀u,因此var将被推断为unsigned int.有没有办法实现类似的东西uint32_tuint64_t类型?C++ 11或C++ 14中有后缀吗?

c++11

8
推荐指数
1
解决办法
1094
查看次数

Bazel、python3 和 python 解释器选项

我有一个庞大而多样的代码库,其中大部分是 python(3),我正在尝试用 bazel 组织它。

理想情况下,我希望(按重要性的大致顺序):

  1. 默认为python3(理想情况下是特定版本,但我可以只使用其中的任何内容/usr/bin/python3
  2. 将选项发送到 python 解释器,理想情况下以每个目标的方式
  3. 覆盖特定目标的python解释器和其他选项的选项

现在我有一个部分解决方案,我想就它是否惯用以及在哪里可以改进提出一些建议。

/BUILD我有

genrule(
  name = "python3_interpreter",
  outs = ["python"],
  cmd = "echo '#!/bin/bash\n/usr/bin/python3 -OO \"$$@\"\n' > $@",
  executable = True,
)
py_runtime(
  name = "python3",
  visibility = ["//visibility:public"],
  interpreter = ":python3_interpreter",
  files = []
)
Run Code Online (Sandbox Code Playgroud)

创建一个中间人 python 解释器,我可以在其中向 python 解释器添加选项(-OO在这种情况下)。

/.bazelrc我有

build --python_top=//:python3
run --python_top=//:python3
Run Code Online (Sandbox Code Playgroud)

默认为该解释器。

我可能会在 周围使用一个宏genrule来使添加解释器选项更符合人体工程学(并且可能python3以更结构化的方式进行搜索),但它仍然感觉很像黑客。

我还可以使用外部存储库从源代码下载和构建特定的 Python 版本,这需要付出更多努力,但也更加隐秘。

这些选项似乎都不是特别令人满意,也没有一个允许我覆盖每个目标的内容。

欢迎任何建议或建设性批评。我已经在使用rules_python来管理 pip …

python python-3.x bazel

5
推荐指数
0
解决办法
809
查看次数

如何静态断言函数末尾无法到达

我在函数末尾有一个相当复杂的match语句(带有嵌套等)。ifthis 的每个分支都应该显式地从函数返回,或者调用某个-> !函数(例如process::exit)。

为了与其他程序员进行通信,并保护自己免受自己的伤害,我想告诉编译器断言此后的任何内容match都是无法访问的。我知道它知道如何静态地执行此操作,因为如果我将代码放在那里,我会收到编译时警告。

我尝试过的两件事:

  1. match语句分配给let _: ! = match .... 然而,这!仍然是实验性的,所以这不起作用

  2. 将其包裹match在封口中move || -> ! { match ... }();return但是,这限制了我只能从父函数中进行操作。


我的情况的具体细节不一定适用于一般情况:

  • 有问题的函数是fn main() -> ()
  • 条件逻辑必须要么分支到()返回函数,要么分支到!返回函数
  • 如果不这样做,则表明错误未正确处理或报告的路径
  • return条件逻辑中的 -ing 函数需要使用由匹配项展开的值

rust

1
推荐指数
1
解决办法
871
查看次数

标签 统计

rust ×2

bazel ×1

c++11 ×1

embedded ×1

python ×1

python-3.x ×1

unsafe ×1