Description
I developed a static analysis tool to detect issues related to memory ordering, thread performance, and security. During my examination of several crates, I encountered alarms triggered by the following code:
{
"AtomicCorrelationViolation": {
"bug_kind": "AtimicCorrelationViolation",
"possibility": "Possibly",
"diagnosis": {
"atomic": "/Users/wangcheng/.cargo/registry/src/index.crates.io-6f17d22bba15001f/signal-hook-registry-1.4.1/src/half_lock.rs:150:30: 150:52"
},
"explanation": "Using an atomic operation with a stronger memory ordering than necessary can lead to unnecessary performance overhead. Using Acquire is sufficient to ensure the correctness of the program"
}
},
{
"AtomicCorrelationViolation": {
"bug_kind": "AtimicCorrelationViolation",
"possibility": "Possibly",
"diagnosis": {
"atomic": "/Users/wangcheng/.cargo/registry/src/index.crates.io-6f17d22bba15001f/signal-hook-registry-1.4.1/src/half_lock.rs:205:30: 205:52"
},
"explanation": "Using an atomic operation with a stronger memory ordering than necessary can lead to unnecessary performance overhead. Using Acquire is sufficient to ensure the correctness of the program"
}
},
{
"AtomicCorrelationViolation": {
"bug_kind": "AtimicCorrelationViolation",
"possibility": "Possibly",
"diagnosis": {
"atomic": "/Users/wangcheng/.cargo/registry/src/index.crates.io-6f17d22bba15001f/signal-hook-registry-1.4.1/src/half_lock.rs:228:48: 228:70"
},
"explanation": "Using an atomic operation with a stronger memory ordering than necessary can lead to unnecessary performance overhead. Using Acquire is sufficient to ensure the correctness of the program"
}
},
{
"AtomicCorrelationViolation": {
"bug_kind": "AtimicCorrelationViolation",
"possibility": "Possibly",
"diagnosis": {
"atomic": "/Users/wangcheng/.cargo/registry/src/index.crates.io-6f17d22bba15001f/signal-hook-registry-1.4.1/src/half_lock.rs:81:34: 81:61"
},
"explanation": "Using an atomic operation with a stronger memory ordering than necessary can lead to unnecessary performance overhead. Using AcqRel is sufficient to ensure the correctness of the program."
}
}
After reviewing the code, I believe the detector's results are accurate.
signal-hook/signal-hook-registry/src/half_lock.rs
Lines 150 to 154 in 7dfed90
Acquire
at 150 is ok because data
is dereferenced at 154. We should use Acquire
to observe other modifications made to this location. Therefore, I believe that the load operation for the head should use Acquire
. Similar usage appears in the code below:signal-hook/signal-hook-registry/src/half_lock.rs
Lines 205 to 209 in 7dfed90
Additionally, using
Acquire
at 228 is sufficient, as this line converts the pointer into a smart pointer. Since smart pointers automatically implement dereferencing, seeing the contents inside the local at 229 during drop
is necessary. Therefore, using Acquire
ensures the correctness of the program.signal-hook/signal-hook-registry/src/half_lock.rs
Lines 226 to 230 in 7dfed90
Finally, the
swap
at 81 should use AcqRel
. We need to ensure a Release
fence for the successful initialization at line 77. Additionally, the drop
at 86 requires visibility into the content pointed by the pointer, necessitating an Acquire
fence. Therefore, using AcqRel
for swap ensures the program's correctnesssignal-hook/signal-hook-registry/src/half_lock.rs
Lines 77 to 86 in 7dfed90
(happy to make a PR if this looks reasonable)