`__CPROVER_fence()` 参数

2024-03-14

我看到类似的代码__CPROVER_fence("RRfence", "RWfence");正在像这样的项目中使用Linux RCU 测试 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/locks.h?h=v5.16-rc3#n72和用于 CBMC 分析的 pthread 包装器。我查看了在线文档,但发现发送到此 CBMC 函数的字符串上没有文本。

有哪些可用参数__CPROVER_fence?

我的看法是,它是一个注释/函数,用于表示实际实现所执行的障碍/栅栏。即,它是实际功能的分析存根。显然参数表示障碍类型,但我还没有找到实际参数和相应障碍类型的引用。即,“RRFence”是读取栅栏,意味着该点之前的读取将在此点之后的读取之前完成(作为猜测)。


使用来源卢克。

所有符号都是“栅栏”,表示某些 CPU 屏障原语已阻止危险类型的发生。因此,所有先前的“读/写”都将在后续“读/写”之前提交到缓存。 “函数”可以接受这些值的任意组合/排列。

'cumul'版本记录在第 4.4.2 节中放牧猫... http://www0.cs.ucl.ac.uk/staff/j.alglave/papers/toplas14.pdf,它们是“传递”栅栏,表明所有线程/核心都会看到顺序。


确实如哈斯图尔昆 https://stackoverflow.com/users/20270/hasturkun已经指出,有八个注释被接受CPROVER_fence(). See 维基百科危险 https://en.wikipedia.org/wiki/Hazard_(computer_architecture)了解详细信息以及其他引用的论文。

  • RRFence,不是特定危险,但可能导致事件级联
  • RWFence,这是一种反依赖关系,对于依赖项可能会出现问题。
  • WRFence,仅涉及一个变量的特定危险
  • WWFence 指出,仅一个“变量”就可能导致输出危险。
  • WWcumul
  • RRcumul
  • RWcumul
  • WRcumul

“cumul”版本与普通的“fence”类似,但所有核心的顺序都保留。例如,在 ARM CPU 上,所有栅栏都是“cumul”类型。直“栅栏”仅适用于无序问题,例如单个核心的管道和/或写入缓冲区。

所有符号都是“栅栏”,表示某些 CPU 屏障原语已阻止危险类型的发生。因此,所有先前的“读/写”都将在后续的“读/写”之前提交。 “函数”可以接受这些值的任何排列。

有些东西(例如不依赖于其他一致值的计数器)只需使用一些栅栏就可以了。然而,其他值/元组/结构是多地址的(非原子加载/存储),并且可能需要以一致的方式读取/写入多个值。相互依赖访问的分类表三。石蕊测试名称词汇表 of 放牧猫... http://www0.cs.ucl.ac.uk/staff/j.alglave/papers/toplas14.pdf.

这一页,弱内存的软件验证 http://www.cprover.org/wmm/,CProver 是针对该主题的罗塞塔石碑。它主要指“火枪手”工具,但进一步阅读会发现 CBMC 工具中融入了许多概念。甚至页面的 URL 也包含“wmm”,它也在“goto-instrument”目录中作为“wmm”实现了此功能。

  • 关于弱记忆力的论文 http://www0.cs.ucl.ac.uk/staff/j.alglave/papers/toplas14.pdf- 第 1 节末尾(第 A:5 页)详细说明了将这些模型纳入 CBMC。这些模型包括 TSO、PSO、RMO 和 Power。这些可以在“cbmc/src/goto-instrument/wmm/wmm.h”中找到。
  • 通过程序转换对弱内存进行软件验证 http://www.cprover.org/etaps/esop.pdf描述了对 PostgreSQL 的修复以及 Linux RCU 代码的检测;因此,所引用的开源项目可能源自 CBMC 弱内存实现者,因此可能没有在线文档。

目录CBMC并发 https://github.com/diffblue/cbmc/tree/develop/regression/cbmc-concurrency and ansi-c https://github.com/diffblue/cbmc/blob/develop/src/ansi-c有很多使用的例子CPROVER_fence()和其他内存建模原语。

要实现的示例 C 验证器代码pthread_mutex_lock() https://github.com/diffblue/cbmc/blob/develop/src/ansi-c/library/pthread_lib.c#L110进行分析,

inline int pthread_mutex_lock(pthread_mutex_t *mutex)
{
  __CPROVER_HIDE:;
  #ifdef __CPROVER_CUSTOM_BITVECTOR_ANALYSIS
  __CPROVER_assert(__CPROVER_get_must(mutex, "mutex-init"),
                   "mutex must be initialized");

  __CPROVER_assert(!__CPROVER_get_may(mutex, "mutex-destroyed"),
                   "mutex must not be destroyed");

  __CPROVER_assert(__CPROVER_get_must(mutex, "mutex-recursive") ||
                   !__CPROVER_get_may(mutex, "mutex-locked"),
                   "attempt to lock non-recurisive locked mutex");

  __CPROVER_set_must(mutex, "mutex-locked");
  __CPROVER_set_may(mutex, "mutex-locked");

  __CPROVER_assert(*((__CPROVER_mutex_t *)mutex)!=-1,
    "mutex not initialised or destroyed");
  #else
  __CPROVER_atomic_begin();
  __CPROVER_assume(!*((__CPROVER_mutex_t *)mutex));
  *((__CPROVER_mutex_t *)mutex)=1;
  __CPROVER_atomic_end();

  __CPROVER_fence("WWfence", "RRfence", "RWfence", "WRfence",
                  "WWcumul", "RRcumul", "RWcumul", "WRcumul");
  #endif

  return 0; // we never fail
}

我的理解是它正在检查,

  • 只有一把锁
  • 锁在调用之前初始化
  • 锁在持有时不会被破坏
  • 持有锁时不会重新初始化
  • 调用后,所有弱排序内存项都会被解析(所有缓存都被刷新)。

有趣的是,man pthread_mutex_lock()没有提及任何有关 CPU 同步或栅栏的信息。我们通过互斥/锁编程实现了优先级反转、死锁等,但它也会以管道性能为代价。确实在 ARM/Linux/glibc 上,kuser_cmpxchg32_fixup https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/entry-armv.S?h=v5.16-rc4#n929 call smp_dmb arm来满足这个要求。类似的回归测试显示失败pthread_create()其中写入缓冲区可能会在初始线程启动时将值保留为不确定状态,除非插入屏障作为pthread_create()没有这个同步功能。

看来这项工作是最近才完成的(按照某些标准),论文日期为 2013 年,Linux RCU 提交日期为 2016 年。作者可能希望保持 API 的流畅性。可能他们更专注于证明证明者这一更有趣的任务,而没有时间记录这个接口。


  • 道格·李的烹饪书 http://gee.cs.oswego.edu/dl/jmm/cookbook.html- 有助于内存排序类型与具体 CPU 类型的比较。
  • C++ 映射到 CPU https://www.cl.cam.ac.uk/%7Epes20/cpp/cpp0xmappings.html- C++ 内存顺序类型使用的 CPU 指令。

Note:答案的早期版本假设此 API 涵盖了与非缓存总线主控的缓存同步。事实并非如此。系统程序员尝试使用cbmc如果担心的话,需要使用其他机制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`__CPROVER_fence()` 参数 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • JUnit5:测试多个类而不重复代码

    我已经用 Java 构建了自己的堆栈实现 如下所示 有一个接口 Stack 它提供了基本功能 pop push peek 等 然后我有 2 个具体的类 一个借助数组 另一个带有链表 在这种情况下如何并不重要 现在我的问题是 我想用 JUni
  • Android sqlite将WAL文件内容刷新到主数据库文件中

    我正在尝试创建我的应用程序数据库内容的备份 对于大多数设备来说 它工作正常 但有一些设备默认启用了 wal 模式 这会导致问题 从我读过的所有内容来看 调用 pragma wal checkpoint 应该将 wal 文件的内容刷新到主数据
  • Python argparse:在帮助条目之间插入空行

    使用 argparse 时 传递 help程序生成帮助文本 不幸的是 它很难阅读 因为选项之间没有空行 这里摘录一段来说明 optional arguments h help show this help message and exit
  • 更新数组变量的状态

    我想更改 setArray 的状态 但无法更改它 console log 显示空数组 其他州都在工作 但这个州不行 我也使用过 useEffect 但什么也没有发生 请给我一个解决方案 import React from react imp
  • 如何创建与列相关的大小的 Pyspark 窗口函数

    当我尝试使用 pyspark 中的窗口函数对与列相关的前行数进行累积值时 出现意外错误 重现我遇到的错误的最小工作示例 MWE 如下 from pyspark sql import Window import pandas as pd df
  • 在Python中处理键盘事件

    如何在 python 中处理键盘事件 更确切地说 我需要为我的命令行应用程序管理键盘箭头和其他一些键 是否有一个模块可以实现此目的 或者我需要使用例如 if get key mykey do Something 它是伪代码 来逐个处理键 我
  • 使用 Django 在 Heroku 上提供根级静态文件?

    我需要在 Heroku 上提供几个根级静态文件 例如 domain com favicon ico 以下是当前的文件列表 favicon ico crossdomain xml sitemap xml robots txt humans t
  • 检测服务中的屏幕方向变化[重复]

    这个问题在这里已经有答案了 一个非常简单直接的问题 服务是否可以检测屏幕方向的变化 如果是这样 怎么办 此链接将回答您的问题 如何使用服务来监控 Android 中的方向变化 https stackoverflow com question
  • MUI 网格禁用 GridToolBar 中的导出按钮

    如何在 MUI 中禁用 覆盖 XGrid GridToolbar 的导出按钮 对于将来重新讨论这个问题的任何人 我发现 DataGrid 组件上的组件组件属性允许您传入具有 csvOptions 的对象来禁用导出按钮
  • 为什么从 INSTALLED_APPS 中删除“django.contrib.sites”可以修复我突然出现的“DoesNotExist at /admin/”错误?

    昨天我设置了一个新的 Django 应用程序 当我停止工作时 管理员仍然可以正常工作 今天早上我运行服务器 我看到这个错误页面 DoesNotExist at admin Site matching query does not exist
  • 在 mongodb 中按 $type 编号查找

    我有以下文件 gt db people insert name Bob gt db people insert name 42 如果我需要按类型查找String我可以用 gt db people find name type 2 Where
  • 运行时服务不再注入 DNX 控制台应用程序 (RC1)

    我曾经能够注入运行时服务 例如IApplicationEnvironment到构造函数中PogramDNX 控制台应用程序的类 但是 使用最新的 RC1 CI 版本 服务不再被注入 public Program IApplicationEn
  • 无法将 MySQL.DateTime 转换为具有 0000-00-00 00:00:00 值的 System.DateTime

    我正在开发一个 C 项目 但遇到了一个问题 该程序允许用户连接到 MySQL 数据库并从每个选定的表中检索信息并将数据写入文件 问题是因为我不知道架构会是什么样子或者它会包含什么值 如果时间戳列包含日期 0000 00 00 00 00 0
  • Python-将稀疏矩阵行与非稀疏向量乘以索引

    我当前的软件项目涉及使用 python 实现求解线性系统的数值方法 所谓的SOR 方法 它基本上是这样工作的 给定一个线性系统 ax1 bx2 cx3 b1 dx1 ex2 fx3 b2 gx1 hx2 ix3 b3 重新排列方程为 x1
  • 如何统计QEMU从运行开始到结束执行的客户指令数量?

    我想对 QEMU 每秒的客户指令进行基准测试 以将其与其他模拟器进行比较 如何获取访客指令数 我对用户模式和完整系统模式都感兴趣 我现在唯一的解决方案是使用简单的跟踪记录所有指令exec tb or d in asm 如何使用 QEMU 的
  • 为什么定义函数之前需要使用分号? [复制]

    这个问题在这里已经有答案了 我见过一些奇怪的 在一些 jQuery 插件源代码的函数开头 如下所示 function 有人可以解释为什么他们需要使用 在这种情况下 当文件中当前存在的代码不包含新代码时 此分号将帮助您正确地将新代码连接到文件
  • 长按后移动事件

    在我的 GestureDetector 中调用长按后 如何监听移动事件 当用户长按时 他启动选择模式 并且可以将一个正方形拖到屏幕中 但我注意到 在使用 LongPress 后 不会调用 onScroll 尝试解决这个问题一段时间 目前的解
  • 序言排列函数

    我是 Prolog 的新手 我知道排列的递归函数 即 per per L X P del X L L1 per L1 P 我想知道当我们收到时这个函数在最后一次迭代中的逻辑树per 它返回哪个元素 Sonia 您还没有给我们 del 谓词
  • .NET 异常类型的 _xcode 字段是什么?

    在我的单元测试中 我需要对两个对象执行深度相等测试 这两个对象应该是相同的 在测试过程中 我发现系统类型中一些有趣的字段破坏了我的代码 Exception xcode是最新的 以下是有关该领域的一些事实 它被初始化为 532459699在所
  • `__CPROVER_fence()` 参数

    我看到类似的代码 CPROVER fence RRfence RWfence 正在像这样的项目中使用Linux RCU 测试 https git kernel org pub scm linux kernel git torvalds li