Merge pull request #29 from github/fourth-query

add `ql/override-parameter-name`
This commit is contained in:
Erik Krogh Kristensen
2021-05-28 18:00:48 +02:00
committed by GitHub
3 changed files with 43 additions and 14 deletions

View File

@@ -32,6 +32,7 @@ class AstNode extends TAstNode {
/**
* Gets the location of the AST node.
*/
cached
Location getLocation() {
exists(Generated::AstNode node | not node instanceof Generated::ParExpr |
node = toGenerated(this) and

View File

@@ -0,0 +1,31 @@
/**
* @name Using a different paramater name than used in the super-predicate.
* @description Using another parameter can be an indication of copy-pasted code, or a mistake.
* @kind problem
* @problem.severity warning
* @id ql/override-parameter-name
* @tags correctness
* maintainability
* @precision medium
*/
import ql
pragma[noinline]
private predicate getAnOverridingParameter(
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
) {
pred.overrides(sup) and
parameter = pred.getParameter(index)
}
from ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
where
getAnOverridingParameter(pred, sup, parameter, index) and
sup.getParameter(index).getName() != pred.getParameter(index).getName() and
// avoid duplicated alerts with `ql/override-swapped-name`
not exists(int other | other != index |
sup.getParameter(other).getName() = pred.getParameter(index).getName()
)
select parameter, pred.getParameter(index).getName() + " was $@ in the super class.",
sup.getParameter(index), "named " + sup.getParameter(index).getName()

View File

@@ -2,7 +2,7 @@
* @name Swapped parameter names in overriding predicate.
* @description Swapping the parameter names in an overriding method indicates an implementation mistake.
* @kind problem
* @problem.severity warning
* @problem.severity error
* @id ql/override-swapped-name
* @tags correctness
* maintainability
@@ -13,21 +13,18 @@ import ql
pragma[noinline]
private predicate getAnOverridingParameter(
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName,
int index
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
) {
pred.overrides(sup) and
parameter = pred.getParameter(index) and
parameter.getName() = parName and
sup.getParameter(index).getName() = superName
parameter = pred.getParameter(index)
}
from
ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName,
int index
from ClassPredicate pred, ClassPredicate sup, VarDecl parameter, int index
where
getAnOverridingParameter(pred, sup, parameter, parName, superName, index) and
superName != parName and
exists(int other | other != index | sup.getParameter(other).getName() = parName)
select parameter, parName + " was $@ in the super class.", sup.getParameter(index),
"named " + superName
getAnOverridingParameter(pred, sup, parameter, index) and
sup.getParameter(index).getName() != pred.getParameter(index).getName() and
exists(int other | other != index |
sup.getParameter(other).getName() = pred.getParameter(index).getName()
)
select parameter, pred.getParameter(index).getName() + " was $@ in the super class.",
sup.getParameter(index), "named " + sup.getParameter(index).getName()