我们是否需要一个读锁来读取除变量小于memalign之外的整数以及某些缓存情况?
答案 0 :(得分:1)
分析器假定因为f1()
的地址已被采用,所以可以通过任何上下文的函数指针调用它。例如,如果您有一个线程更新x
:
lock xlock;
update x;
unlock xlock;
并且另一个线程通过函数指针同时调用f1()
,第二个线程中对f1()
的访问将不受锁的保护。因此,它可能会看到x
的部分更新,或者看到更新错误地与其他更新有关。
函数指针重要的原因是如果永远不会采用f1()
的地址,那么分析器可以确切地确定函数的调用位置。当地址被采用时,它必须假设最坏的情况。
答案 1 :(得分:1)
从你引用的文字(强调我的):
如果一个函数已经获取了它的地址,那么我们假设我们这样做了 不知道对该功能进行的每次通话的背景。
因为lint无法确定可以调用f1
的每个上下文,所以它假定可以在任何上下文中调用它,包括访问x
会导致某些数据竞争的上下文。
合理地说,你可能不会通过返回x
来击中任何可怕的东西。但这是一个概率,使用lint的重点是减少代码如何与意外输入一起工作的不确定性。