Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

NonAtomicVolatileUpdate misses volatile increments and decrements with parenthesized operands

Aperta Adatta ai principianti
#6,214 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di google/error-prone

Tutte le issue di google/error-prone

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.