我对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;
};
并删除警告。
我的问题: - 在这种情况下使用“挥发性”是否有害。如果是,那么为什么? - 我认为我不应该将struct的成员变为“volatile”。但是,那么我们如何摆脱Csparse警告。
根据@ https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt给出的文件 @ http://lwn.net/Articles/233482/。 我们应该总是避免使用volatile。
答案 0 :(得分:1)
不,它没有害处。不知道它为什么应该或可能对什么有害?
如果您调用的代码需要volatile
指针,那么传递非volatile
代码是不正确的,因为调用上下文中的代码可能不是在这种情况下,适当地适应volatile
值的要求。
答案 1 :(得分:1)
volatile指示编译器不要对该变量进行任何优化。因此,它将保证使用最新的变量值。这可能会被外部事件改变。 通常在处理外部事件时使用volatile,例如硬件相关引脚的中断。 我不认为,它有害。但是为什么要在不需要的时候使用,因为优化有助于提高效率,所以如果你确定即使变量被优化,也不能被外部事件改变,那么很好,没有易失性。