mirror of
https://github.com/github/codeql.git
synced 2025-12-22 19:56:32 +01:00
131 lines
3.3 KiB
Plaintext
131 lines
3.3 KiB
Plaintext
/**
|
|
* Provides classes for modeling comparisons such as `==`, `!=` and `<`.
|
|
*/
|
|
|
|
import semmle.code.cpp.exprs.Expr
|
|
|
|
/**
|
|
* A C/C++ comparison operation, that is, either an equality operation or a relational operation.
|
|
*
|
|
* This is a QL base class for all comparisons.
|
|
*/
|
|
class ComparisonOperation extends BinaryOperation, @cmp_op_expr { }
|
|
|
|
/**
|
|
* A C/C++ equality operation, that is, either "==" or "!=".
|
|
*/
|
|
class EqualityOperation extends ComparisonOperation, @eq_op_expr {
|
|
override int getPrecedence() { result = 9 }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ equal expression.
|
|
* ```
|
|
* bool c = (a == b);
|
|
* ```
|
|
*/
|
|
class EQExpr extends EqualityOperation, @eqexpr {
|
|
override string getAPrimaryQlClass() { result = "EQExpr" }
|
|
|
|
override string getOperator() { result = "==" }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ not equal expression.
|
|
* ```
|
|
* bool c = (a != b);
|
|
* ```
|
|
*/
|
|
class NEExpr extends EqualityOperation, @neexpr {
|
|
override string getAPrimaryQlClass() { result = "NEExpr" }
|
|
|
|
override string getOperator() { result = "!=" }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ relational operation, that is, one of `<=`, `<`, `>`, or `>=`.
|
|
*/
|
|
class RelationalOperation extends ComparisonOperation, @rel_op_expr {
|
|
override int getPrecedence() { result = 10 }
|
|
|
|
/**
|
|
* Gets the operand on the "greater" (or "greater-or-equal") side
|
|
* of this relational expression, that is, the side that is larger
|
|
* if the overall expression evaluates to `true`; for example on
|
|
* `x <= 20` this is the `20`, and on `y > 0` it is `y`.
|
|
*/
|
|
Expr getGreaterOperand() { none() } // overridden in subclasses
|
|
|
|
/**
|
|
* Gets the operand on the "lesser" (or "lesser-or-equal") side
|
|
* of this relational expression, that is, the side that is smaller
|
|
* if the overall expression evaluates to `true`; for example on
|
|
* `x <= 20` this is `x`, and on `y > 0` it is the `0`.
|
|
*/
|
|
Expr getLesserOperand() { none() } // overridden in subclasses
|
|
}
|
|
|
|
/**
|
|
* A C/C++ greater than expression.
|
|
* ```
|
|
* bool c = (a > b);
|
|
* ```
|
|
*/
|
|
class GTExpr extends RelationalOperation, @gtexpr {
|
|
override string getAPrimaryQlClass() { result = "GTExpr" }
|
|
|
|
override string getOperator() { result = ">" }
|
|
|
|
override Expr getGreaterOperand() { result = getLeftOperand() }
|
|
|
|
override Expr getLesserOperand() { result = getRightOperand() }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ less than expression.
|
|
* ```
|
|
* bool c = (a < b);
|
|
* ```
|
|
*/
|
|
class LTExpr extends RelationalOperation, @ltexpr {
|
|
override string getAPrimaryQlClass() { result = "LTExpr" }
|
|
|
|
override string getOperator() { result = "<" }
|
|
|
|
override Expr getGreaterOperand() { result = getRightOperand() }
|
|
|
|
override Expr getLesserOperand() { result = getLeftOperand() }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ greater than or equal expression.
|
|
* ```
|
|
* bool c = (a >= b);
|
|
* ```
|
|
*/
|
|
class GEExpr extends RelationalOperation, @geexpr {
|
|
override string getAPrimaryQlClass() { result = "GEExpr" }
|
|
|
|
override string getOperator() { result = ">=" }
|
|
|
|
override Expr getGreaterOperand() { result = getLeftOperand() }
|
|
|
|
override Expr getLesserOperand() { result = getRightOperand() }
|
|
}
|
|
|
|
/**
|
|
* A C/C++ less than or equal expression.
|
|
* ```
|
|
* bool c = (a <= b);
|
|
* ```
|
|
*/
|
|
class LEExpr extends RelationalOperation, @leexpr {
|
|
override string getAPrimaryQlClass() { result = "LEExpr" }
|
|
|
|
override string getOperator() { result = "<=" }
|
|
|
|
override Expr getGreaterOperand() { result = getRightOperand() }
|
|
|
|
override Expr getLesserOperand() { result = getLeftOperand() }
|
|
}
|