diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index 0c3a4ea3ecd..dc378cf190e 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -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 diff --git a/ql/src/queries/style/OverridingParameterName.ql b/ql/src/queries/style/OverridingParameterName.ql new file mode 100644 index 00000000000..6973c046ae0 --- /dev/null +++ b/ql/src/queries/style/OverridingParameterName.ql @@ -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() diff --git a/ql/src/queries/style/SwappedParameterNames.ql b/ql/src/queries/style/SwappedParameterNames.ql index 417decb57f7..7b2196adc5e 100644 --- a/ql/src/queries/style/SwappedParameterNames.ql +++ b/ql/src/queries/style/SwappedParameterNames.ql @@ -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()