Skip to content

Commit 2736b01

Browse files
authored
QL: Merge pull request #29 from github/fourth-query
add `ql/override-parameter-name`
2 parents fe6e7a8 + 775a0ee commit 2736b01

3 files changed

Lines changed: 43 additions & 14 deletions

File tree

ql/src/codeql_ql/ast/Ast.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class AstNode extends TAstNode {
3232
/**
3333
* Gets the location of the AST node.
3434
*/
35+
cached
3536
Location getLocation() {
3637
exists(Generated::AstNode node | not node instanceof Generated::ParExpr |
3738
node = toGenerated(this) and
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* @name Using a different paramater name than used in the super-predicate.
3+
* @description Using another parameter can be an indication of copy-pasted code, or a mistake.
4+
* @kind problem
5+
* @problem.severity warning
6+
* @id ql/override-parameter-name
7+
* @tags correctness
8+
* maintainability
9+
* @precision medium
10+
*/
11+
12+
import ql
13+
14+
pragma[noinline]
15+
private predicate getAnOverridingParameter(
16+
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
17+
) {
18+
pred.overrides(sup) and
19+
parameter = pred.getParameter(index)
20+
}
21+
22+
from ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
23+
where
24+
getAnOverridingParameter(pred, sup, parameter, index) and
25+
sup.getParameter(index).getName() != pred.getParameter(index).getName() and
26+
// avoid duplicated alerts with `ql/override-swapped-name`
27+
not exists(int other | other != index |
28+
sup.getParameter(other).getName() = pred.getParameter(index).getName()
29+
)
30+
select parameter, pred.getParameter(index).getName() + " was $@ in the super class.",
31+
sup.getParameter(index), "named " + sup.getParameter(index).getName()

ql/src/queries/style/SwappedParameterNames.ql

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @name Swapped parameter names in overriding predicate.
33
* @description Swapping the parameter names in an overriding method indicates an implementation mistake.
44
* @kind problem
5-
* @problem.severity warning
5+
* @problem.severity error
66
* @id ql/override-swapped-name
77
* @tags correctness
88
* maintainability
@@ -13,21 +13,18 @@ import ql
1313

1414
pragma[noinline]
1515
private predicate getAnOverridingParameter(
16-
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName,
17-
int index
16+
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
1817
) {
1918
pred.overrides(sup) and
20-
parameter = pred.getParameter(index) and
21-
parameter.getName() = parName and
22-
sup.getParameter(index).getName() = superName
19+
parameter = pred.getParameter(index)
2320
}
2421

25-
from
26-
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName,
27-
int index
22+
from ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
2823
where
29-
getAnOverridingParameter(pred, sup, parameter, parName, superName, index) and
30-
superName != parName and
31-
exists(int other | other != index | sup.getParameter(other).getName() = parName)
32-
select parameter, parName + " was $@ in the super class.", sup.getParameter(index),
33-
"named " + superName
24+
getAnOverridingParameter(pred, sup, parameter, index) and
25+
sup.getParameter(index).getName() != pred.getParameter(index).getName() and
26+
exists(int other | other != index |
27+
sup.getParameter(other).getName() = pred.getParameter(index).getName()
28+
)
29+
select parameter, pred.getParameter(index).getName() + " was $@ in the super class.",
30+
sup.getParameter(index), "named " + sup.getParameter(index).getName()

0 commit comments

Comments
 (0)