NonAtomicVolatileUpdate misses volatile increments and decrements with parenthesized operands
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- java
- Ambito
- testing-qa
Direzione di ricerca
Inizia con il controllo NonAtomicVolatileUpdate ed esamina come riconosce gli operandi di incremento e decremento. L’issue indica ASTHelpers.stripParentheses come possibile metodo per gestire gli operandi tra parentesi. Aggiungi test per gli incrementi e i decrementi tra parentesi di campi int e long volatile e conferma che entrambe le forme producono quattro segnalazioni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Error Prone version
Error Prone 2.49.0 (javac 21.0.8, --source/--target 21)
Affected checks
NonAtomicVolatileUpdate
Description
Adding redundant parentheses around the operand of an increment or decrement causes NonAtomicVolatileUpdate to miss non-atomic updates of volatile fields. For example, (x)++ performs the same read-modify-write as x++, but only the latter is reported. The same issue occurs with decrement operations and with both int and long fields in the reproducer.
Per JLS §15.8.5, parentheses around an expression do not change its value, type, or constant-expression status. The two forms should therefore produce the same findings.
I verified the following pair on Error Prone 2.49.0:
| Check | Rewrite | BEFORE | AFTER | Effect |
|---|---|---|---|---|
NonAtomicVolatileUpdate |
x++ → (x)++ (also y++, x--, and y--) |
4 | 0 | false negative |
The matcher appears to inspect the increment/decrement operand without looking through ParenthesizedTree. A possible fix is to unwrap the operand before matching it, for example with ASTHelpers.stripParentheses.
Reproducers
NonAtomicVolatileUpdate — (x)++ is missed
(x)++ is the same non-atomic read-modify-write of a volatile field as x++.
// BEFORE — 4 findings
public class Vol {
volatile int x;
volatile long y;
void bad() { x++; y++; x--; y--; }
}
// AFTER — 0 findings
public class Vol {
volatile int x;
volatile long y;
void bad() { (x)++; (y)++; (x)--; (y)--; }
}
Expected behavior
Both versions should produce 4 NonAtomicVolatileUpdate findings, one for each increment or decrement of a volatile field. Redundant parentheses do not make these updates atomic.
Actual behavior
The BEFORE version produces 4 findings. The AFTER version produces 0 findings, missing all four non-atomic volatile updates after their operands are parenthesized.
- Lingua principale
- Java
- Stelle
- 7.3k
- Fork
- 827
- Merge medio
- 16h 21m
- PR unite (30g)
- 58
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di google/error-prone
-
ASTHelpers.getSymbol returns null for a parenthesized expression, while javac's TreeInfo.symbol returns the symbol insideForse già presa @vlsi l’ha presa 5 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
google/error-prone#6223 ·
I maintainer di solito rispondono entro 1 giorno
-
InlineTrivialConstant misses an empty-string constant with a parenthesized initializerForse già presa @Youssef-Khogaly l’ha presa 5 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
google/error-prone#6217 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
google/error-prone#6216 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
google/error-prone#6215 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
google/error-prone#6213 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di google/error-prone
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Type/Improvement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ballerina-platform/static-code-analysis-tool#140 ·
I maintainer di solito rispondono entro 1 giorno
-
ready-for-triage triaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
RedHatInsights/notifications-backend#5080 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
protobuf
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
FasterXML/jackson-dataformats-binary#874 ·
I maintainer di solito rispondono entro 1 giorno