许多函数系列以其参数之一作为需通过互锁处理器指令访问的变量地址。 这些是缓存读穿原子指令,如果操作数使用不当,则会导致极其细微的漏洞。
对函数参数使用以下注释将其标识为互锁操作数。
| 互锁操作数标注 | DESCRIPTION |
|---|---|
| _互锁操作数_ | 注解的函数参数是互锁函数中一个的目标操作数。 这些操作数必须具有特定的附加属性。 |
使用_Interlocked_operand_批注的函数参数应在进程之间共享。 用于此批注的变量必须:
声明 为易失性。
不是局部变量。 使用局部变量通常表示对函数意图的误解。 即使某种程度上共享了局部变量,系统的分页要求也会使在另一个进程中寻址变量变得困难。
只能通过互锁功能访问。 如果不显式使用互锁函数,该作可能会访问过时的数据,可能仅在单个处理器的缓存中发生,或者可能会延迟到达系统的其余部分。
系统提供的函数已为互锁操作数添加批注。
以下示例显示了 InterlockedExchange 函数的批注。 此批注指定必须始终通过互锁操作访问 Target 参数。
LONG
InterlockedExchange (
_Inout_ _Interlocked_operand_ LONG volatile *Target,
_In_ LONG Value
);