Add ValidatePredicateGetReturns query and tests

This commit is contained in:
Napalys
2024-11-29 14:33:40 +01:00
parent bd56a3564a
commit 986e1cb597
4 changed files with 71 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
/**
* @name Predicates starting with "get" should return a value
* @description Checks if predicates that start with "get" actually return a value.
* @kind problem
* @problem.severity warning
* @id ql/predicates-get-should-return-value
* @tags correctness
* maintainability
* @precision high
*/
import ql
import codeql_ql.ast.Ast
/**
* Identifies predicates whose names start with "get" followed by an uppercase letter.
* This ensures that only predicates like "getValue" are matched, excluding names like "getter".
*/
predicate isGetPredicate(Predicate pred) { pred.getName().regexpMatch("get[A-Z].*") }
/**
* Checks if a predicate has a return type.
*/
predicate hasReturnType(Predicate pred) {
exists(Type returnType | pred.getReturnType() = returnType)
}
/**
* Checks if a predicate is an alias using getAlias().
*/
predicate isAlias(Predicate pred) {
pred instanceof ClasslessPredicate and exists(pred.(ClasslessPredicate).getAlias())
}
from Predicate pred
where
isGetPredicate(pred) and
not hasReturnType(pred) and
not isAlias(pred)
select pred, "This predicate starts with 'get' but does not return a value."

View File

@@ -0,0 +1,2 @@
| test.qll:4:11:4:18 | ClasslessPredicate getValue | This predicate starts with 'get' but does not return a value. |
| test.qll:25:11:25:28 | ClasslessPredicate getImplementation2 | This predicate starts with 'get' but does not return a value. |

View File

@@ -0,0 +1 @@
queries/style/ValidatePredicateGetReturns.ql

View File

@@ -0,0 +1,28 @@
import ql
// NOT OK -- Predicate starts with "get" but does not return a value
predicate getValue() { none() }
// OK -- starts with get and returns a value
string getData() { result = "data" }
// OK -- starts with get but followed by a lowercase letter, probably should be ignored
predicate getterFunction() { none() }
// OK -- starts with get and returns a value
string getImplementation() { result = "implementation" }
// OK -- is an alias
predicate getAlias = getImplementation/0;
// OK -- Starts with "get" but followed by a lowercase letter, probably be ignored
predicate getvalue() { none() }
// OK -- Does not start with "get", should be ignored
predicate retrieveValue() { none() }
// NOT OK -- starts with get and does not return value
predicate getImplementation2() { none() }
// OK -- is an alias
predicate getAlias2 = getImplementation2/0;