False Negative: IterableIterator.ql misses `iterator() == this` implementations once the guard logic is hidden behind helpers or trivial control flow.
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 52/100
Rechercherichtung
Beginne mit dem Language Abuse/IterableIterator.ql-Checker und vergleiche seine Matching-Logik mit PosCase4_Var2.java, PosCase4_Var3.java und PosCase4_Var4.java. Aktualisiere den Checker und die Regressionstestabdeckung so, dass alle drei selbstiterierenden Implementierungen trotz Helper-Aufrufen oder trivialem Kontrollfluss erkannt werden, während das beabsichtigte Guard-Verhalten erhalten bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
False Negative: IterableIterator.ql misses iterator() == this implementations once the guard logic is hidden behind helpers or trivial control flow.
Version
codeql 2.24.3
Checker
- Checker id:
Language Abuse/IterableIterator.ql - Checker description: This checker detects classes that implement Iterable by returning themselves as the Iterator but lack a guard to prevent multiple concurrent iterations.
Description of the false negative
All three samples still implement the same dangerous pattern: iterator() returns this, the object is also its own Iterator, and hasNext() does not provide a real guard against repeated or concurrent iteration. The only changes are that this is returned through a helper or ternary expression, and hasNext() is dressed up with extra control flow.
Affected test cases
PosCase4_Var2.java
The class still returns itself as the iterator and still lacks a real reuse guard. The helper only hides that.
// A class implements Iterable, declares an iterator() method that returns "this", and any declared method named "hasNext" has a body with exactly one statement, which is not a return statement returning the boolean literal false should be flagged as lacking a guard against multiple concurrent iterations.
package scensct.var.pos;
import java.util.Iterator;
public class PosCase4_Var2 implements Iterable<Object>, Iterator<Object> {
// Keep iterator returning this
public Iterator<Object> iterator() {
Iterator<Object> it = this;
return it;
}
// hasNext with a try-catch that doesn't affect the single return statement
public boolean hasNext() {
try {
return 1 < 2;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// next with a dummy operation
public Object next() {
System.gc();
return null;
}
}
PosCase4_Var3.java
This is the same unsafe self-iterable pattern with one extra layer of indirection.
// A class implements Iterable, declares an iterator() method that returns "this", and any declared method named "hasNext" has a body with exactly one statement, which is not a return statement returning the boolean literal false should be flagged as lacking a guard against multiple concurrent iterations.
package scensct.var.pos;
import java.util.Iterator;
public class PosCase4_Var3 implements Iterable<Object>, Iterator<Object> {
// Inline a helper method call in iterator
public Iterator<Object> iterator() {
return getSelf();
}
private Iterator<Object> getSelf() {
return this;
}
// hasNext with a single statement that computes true via method call
public boolean hasNext() {
return checkHasNext();
}
private boolean checkHasNext() {
return true;
}
public Object next() {
return "dummy";
}
}
PosCase4_Var4.java
The control-flow refactoring does not change the fact that repeated iteration is still unsafe.
// A class implements Iterable, declares an iterator() method that returns "this", and any declared method named "hasNext" has a body with exactly one statement, which is not a return statement returning the boolean literal false should be flagged as lacking a guard against multiple concurrent iterations.
package scensct.var.pos;
import java.util.Iterator;
public class PosCase4_Var4 implements Iterable<Object>, Iterator<Object> {
// iterator returns this via a ternary operator (trivial)
public Iterator<Object> iterator() {
return (System.currentTimeMillis() > 0) ? this : this;
}
// hasNext with a single statement that is not a simple return false
public boolean hasNext() {
for (int i = 0; i < 1; i++) {
return i == 0;
}
return false; // This line is unreachable, but the method body still has one reachable return
}
public Object next() {
return Integer.valueOf(42);
}
}
Cause analysis
The query appears to rely on a very direct return this / return false style match. Once either method is wrapped in a helper, a ternary, or a small control-flow construct, it stops recognizing the same iterator misuse pattern.
That is narrower than it should be. These implementations are still self-iterating objects without a real reentrancy guard.
References
None known.
- Vorherrschende Sprache
- CodeQL
- Sterne
- 10.1k
- Forks
- 2.1k
- Ø Merge
- 2 T. 16 Std.
- Gemergte PRs (30 T.)
- 143
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus github/codeql
-
agentic-workflows
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
false-positive javascript
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
-
C#: cs/simplifiable-boolean-expression false positive on Nullable<bool> compared with a literal Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
false-positive
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
palladius/rails8-app-on-gcp#145 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
elastic/gradle-plugins#156 ·
-
area:workflow bug ready-for-agent
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
fil-donadoni/tolaria#4409 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
dotenvx/dotenv-vscode#139 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Fission-AI/OpenSpec#1960 ·