diff --git a/ql/src/queries/style/GetAPrimaryQlClassConsistency.ql b/ql/src/queries/style/GetAPrimaryQlClassConsistency.ql index abd528eeb58..dd5da5d78ea 100644 --- a/ql/src/queries/style/GetAPrimaryQlClassConsistency.ql +++ b/ql/src/queries/style/GetAPrimaryQlClassConsistency.ql @@ -5,7 +5,7 @@ * @problem.severity error * @id ql/primary-ql-class-consistency * @tags correctness - * @precision low + * @precision very-high */ import ql diff --git a/ql/src/queries/style/SwappedParameterNames.ql b/ql/src/queries/style/SwappedParameterNames.ql new file mode 100644 index 00000000000..417decb57f7 --- /dev/null +++ b/ql/src/queries/style/SwappedParameterNames.ql @@ -0,0 +1,33 @@ +/** + * @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 + * @id ql/override-swapped-name + * @tags correctness + * maintainability + * @precision high + */ + +import ql + +pragma[noinline] +private predicate getAnOverridingParameter( + ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName, + int index +) { + pred.overrides(sup) and + parameter = pred.getParameter(index) and + parameter.getName() = parName and + sup.getParameter(index).getName() = superName +} + +from + ClassPredicate pred, ClassPredicate sup, VarDecl parameter, string parName, string superName, + 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 diff --git a/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.expected b/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.expected new file mode 100644 index 00000000000..367ac8b8471 --- /dev/null +++ b/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.expected @@ -0,0 +1,2 @@ +| Test.qll:12:27:12:35 | succ | succ was $@ in the super class. | Test.qll:4:27:4:35 | pred | named pred | +| Test.qll:12:38:12:46 | pred | pred was $@ in the super class. | Test.qll:4:38:4:46 | succ | named succ | diff --git a/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.qlref b/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.qlref new file mode 100644 index 00000000000..cab8c347410 --- /dev/null +++ b/ql/test/queries/style/SwappedParameterNames/SwappedParameterNames.qlref @@ -0,0 +1 @@ +queries/style/SwappedParameterNames.ql \ No newline at end of file diff --git a/ql/test/queries/style/SwappedParameterNames/Test.qll b/ql/test/queries/style/SwappedParameterNames/Test.qll new file mode 100644 index 00000000000..5c8083d3098 --- /dev/null +++ b/ql/test/queries/style/SwappedParameterNames/Test.qll @@ -0,0 +1,13 @@ +import ql + +class Sup extends AstNode { + abstract predicate step(Expr pred, Expr succ); +} + +class Correct extends Sup { + override predicate step(Expr pred, Expr succ) { none() } +} + +class Wrong extends Sup { + override predicate step(Expr succ, Expr pred) { none() } // <- swapped parameter names +}