c - 在 C 中使用 "volatile"有害吗?

标签 c kernel volatile sparse-matrix

我对 Sparse 很陌生。在稀疏运行期间,我看到了这个警告:

警告:参数 2 中的类型不正确(不同的地址空间)

expected void volatile [noderef] <asn:2>*addr
got void *

基本上,这是因为以下原因而发生的:

struct context{
    void __iomem *base;
};

readl(const volatile void __iomem* add){
....
....
}

function: foo(){
    struct  context *var;
    readl(var->base);   //---> here i got the above mentioned warning
}

为了解决这个问题,我做了以下操作:

struct context{
      - void __iomem *base;
      + volatile void __iomem *base;
};

并删除警告。

我的问题: - 在这种情况下使用“volatile”是否有害。如果是,那么为什么? - 我认为我不应该将结构的成员设置为“易变”。但是,我们如何摆脱 Csparse 警告。

根据@ https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt 给出的文档 @ http://lwn.net/Articles/233482/ . 我们应该始终避免使用 volatile。

最佳答案

不,它没有害处。不知道为什么它应该或可能对什么有害?

如果您调用的代码需要一个 volatile 指针,那么传递一个非 volatile 指针是不正确的,因为调用上下文中的代码可能不是在这种情况下,适本地适应 volatile 值的要求。

关于c - 在 C 中使用 "volatile"有害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26338366/

相关文章:

c - 结构 C 中给定数字的随机数

c# - 无法启动应用程序,KernelBase.dll 错误

c - 编写符合 POSIX 标准的内核

c - Linux 内核中的 stdlib.h 替代方案?

java - 为什么java双重检查锁单例必须使用 volatile 关键字?

c - 释放内存时出现段错误

c - 重复符号和应用程序崩溃

java - 为什么使用 "volatile"在这里没有显示任何差异?

Java volatile 和缓存一致性

c - 将文件中的值放入结构中