False Negative: ConstantLoopCondition.ql misses loops whose exit condition stays constant after being wrapped in helpers.
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 45/100
Rechercherichtung
Beginne mit Likely Bugs/Termination/ConstantLoopCondition.ql und untersuche, wie die vorhandenen Tests konstante Schleifenbedingungen abdecken. Reproduziere die bisher nicht erkannten Fälle in PosCase1_Var5.java, PosCase2_Var4.java und PosCase5_Var5.java und führe anschließend die relevanten Query-Tests aus. Fertig ist die Änderung, wenn alle drei durch Hilfsfunktionen umschlossenen oder abgesicherten nicht terminierenden Schleifen erkannt werden, ohne die bestehende Abdeckung zu verlieren.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Version
codeql 2.24.3
Checker
- Checker id:
Likely Bugs/Termination/ConstantLoopCondition.ql - Checker description: This checker detects loop conditions that are constant within the loop body, potentially leading to non-terminating loops.
Description of the false negative
These loops are still non-terminating for the same reason as the direct patterns: the value that controls exit never changes inside the loop. The code only wraps that check in a helper or rewrites the exit test into an equivalent form.
That should not move the sample outside the scope of Likely Bugs/Termination/ConstantLoopCondition.ql.
Affected test cases
PosCase1_Var5.java
x is never updated, so check(x) never changes. The helper only obscures an otherwise obvious infinite loop.
// while loop with condition variable defined outside and no updates in body should be flagged as infinite loop
package scensct.var.pos;
public class PosCase1_Var5 {
private static boolean check(int val) {
return val > 0;
}
public static void main(String[] args) {
int x = 5;
// condition via helper method, x not updated
while (check(x)) {
System.out.println("stuck via method");
}
}
}
PosCase2_Var4.java
conditionHolds(y) is stable because y is never modified in the loop body. This is still a constant loop condition.
// while loop with condition using final field and variable defined outside should be flagged as infinite loop
package scensct.var.pos;
public class PosCase2_Var4 {
private static final int LIMIT = 10;
public static void main(String[] args) {
int y = 3;
// Extract condition evaluation to a helper method
while (conditionHolds(y)) {
System.out.println("stuck");
}
}
private static boolean conditionHolds(int val) {
return val < LIMIT;
}
}
PosCase5_Var5.java
The loop exit is written as a guarded return, but counter never changes, so shouldExit(counter) remains false forever and the loop still does not terminate.
// while true loop with if condition using variable defined outside controlling all exits should be flagged as infinite loop
package scensct.var.pos;
public class PosCase5_Var5 {
// Helper method to compute constant condition
private static boolean shouldExit(int c) {
return c == 1;
}
public static void main(String[] args) {
int counter = 0;
while (true) {
// Exit condition hidden in method call
if (shouldExit(counter)) {
return;
}
System.out.println("stuck");
}
}
}
Cause analysis
The misses point to a query that is matching specific loop syntax rather than the underlying stability of the condition. Once the condition is computed in a helper or turned into an equivalent exit guard, the analysis seems to stop following it.
That leaves a real blind spot. Developers often factor loop predicates into helpers, and those helpers do not make a non-terminating loop any safer.
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 ·