java/unsafe-double-checked-locking: not reported when the outer guard is written as !(!(x == null))
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 42/100
Direção de pesquisa
Start from the java/unsafe-double-checked-locking query in the java-queries pack and the guard logic it uses to recognise the outer helper == null check. Reproduce with the two sample files, Dcl.java and DclV.java, in a test directory for that query. The gap is that !(!(helper == null)) is not treated as equivalent to helper == null. Done means DclV is reported like Dcl, with a test case added for the double-negated form.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Description of the issue
The query reports double-checked locking on a non-volatile field in Dcl.getHelper(). In DclV.getHelper() the outer guard is !(!(helper == null)) instead of helper == null, with the inner check and the field unchanged. Nothing is reported for DclV, though it's the same test.
Query: java/unsafe-double-checked-locking (codeql/java-queries 1.1.10)
CodeQL CLI: 2.27.2
Code samples
seed/Dcl.java:
class Dcl {
private Helper helper;
Helper getHelper() {
if (helper == null) { // query fires here
synchronized (this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
static class Helper {
int x;
}
}
variant/DclV.java:
class DclV {
private Helper helper;
Helper getHelper() {
if (!(!(helper == null))) { // equivalent outer guard; query silent
synchronized (this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
static class Helper {
int x;
}
}
How to reproduce
codeql database create db --language=java --build-mode=none \
--source-root=<one directory> --overwrite
codeql database analyze db \
codeql/java-queries:codeql-suites/java-security-and-quality.qls \
--format=csv --output=out.csv
# one database per directory
Expected result
"Double-checked locking on the non-volatile field helper is not thread-safe" on DclV, as on Dcl.
Output of the commands above:
### CodeQL 2.27.2 query: java/unsafe-double-checked-locking
### suite: java-security-and-quality.qls, --build-mode=none, per-file isolated databases
### extraction JDK: openjdk version "21.0.11" 2026-04-21 LTS
--- SEED -- expected: query fires (seed/)
"Double-checked locking is not thread-safe","A repeated check on a non-volatile field is not thread-safe, and
--- VARIANT -- expected: query fires, actual: not reported (the bug) (variant/)
(query reported nothing)
- Linguagem predominante
- CodeQL
- Estrelas
- 10.3k
- Forks
- 2.1k
- Merge médio
- 2d 6h
- PRs com merge (30d)
- 137
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/codeql
-
JavaScript externs model StorageEvent() with no type argumentTalvez já em andamento @asgerf assumiu há 14 dias. Abertafalse-positive javascript
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
github/codeql#22632 · 3 comentários · 1 reação · 2 responsáveis ·
Mantenedores costumam responder em até 1 dia
-
Add AlertSuppression.ql for Rust (inline // codeql[...] suppression)Talvez já em andamento @cnuss assumiu há 215 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
github/codeql#21637 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
false-positive
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
github/codeql#21076 · 3 comentários · 3 reações ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 47/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 47/100
Mantenedores costumam responder em até 1 dia
Todas as issues de github/codeql
Issues semelhantes
-
normalizePath removes the Windows device namespace prefixTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
ai-driven-dev/framework#1147 ·
Mantenedores costumam responder em até 1 dia
-
divergence lane:functions
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
cleanup
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
pytorch/tensordict#3456 ·
Mantenedores costumam responder em até 1 dia