Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
- `RULE-6-4-2` - `InheritedOverridableMemberFunction.ql`:
Comment thread
mbaluda marked this conversation as resolved.
- Improved evaluation performance.
- `RULE-7-0-4` - `InappropriateBitwiseOrShiftOperands.ql`:
- Improved evaluation performance.
- Removed false positives related to the `insertion operator`.
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,24 @@ abstract class HiddenInheritedOverridableMemberFunctionSharedQuery extends Query

Query getQuery() { result instanceof HiddenInheritedOverridableMemberFunctionSharedQuery }

private class OverridingDeclaration extends FunctionDeclarationEntry {
OverridingDeclaration() { this.getDeclaration().hasDefinition() implies not this.isDefinition() }
}

private class HiddenDeclaration extends OverridingDeclaration {
HiddenDeclaration() {
// Check if we are overriding a virtual inherited member function
this.getDeclaration().isVirtual() and
// Exclude private member functions, which cannot be inherited.
Comment thread
mbaluda marked this conversation as resolved.
not this.getDeclaration().(MemberFunction).isPrivate()
}
}

query predicate problems(
FunctionDeclarationEntry overridingDecl, string message, FunctionDeclarationEntry hiddenDecl,
OverridingDeclaration overridingDecl, string message, HiddenDeclaration hiddenDecl,
string hiddenDecl_string
) {
not isExcluded(overridingDecl, getQuery()) and
// Check if we are overriding a virtual inherited member function
hiddenDecl.getDeclaration().isVirtual() and
// Exclude private member functions, which cannot be inherited.
not hiddenDecl.getDeclaration().(MemberFunction).isPrivate() and
// The overriding declaration hides the hidden declaration if:
(
// 1. the overriding declaration overrides a function in a base class that is an overload of the hidden declaration
Expand All @@ -46,9 +55,6 @@ query predicate problems(
overridingDecl.getDeclaration().getDeclaringType().getABaseClass() =
hiddenDecl.getDeclaration().getDeclaringType()
) and
// Limit the results to the declarations and not the definitions, if any.
(overridingDecl.getDeclaration().hasDefinition() implies not overridingDecl.isDefinition()) and
(hiddenDecl.getDeclaration().hasDefinition() implies not hiddenDecl.isDefinition()) and
message =
"Declaration for member '" + overridingDecl.getName() +
"' hides overridable inherited member function $@" and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ predicate isConstantExpression(Expr e) {
e.isConstant()
}

predicate isValidShiftConstantRange(Expr right, Type leftType) {
bindingset[right, leftType]
pragma[inline_late]
Comment thread
mbaluda marked this conversation as resolved.
predicate isValidShiftConstantRange(Expr right, MisraCpp23BuiltInTypes::NumericType leftType) {
exists(int value |
value = right.getValue().toInt() and
value >= 0 and
value < leftType.getSize() * 8
value < leftType.getBuiltInSize() * 8
)
}
Comment thread
mbaluda marked this conversation as resolved.

Expand Down Expand Up @@ -97,7 +99,10 @@ where
)
or
// Shift operators - right operand must be unsigned or constant in valid range
exists(BinaryShiftOpOrAssignOp shift, Expr right, Type rightType, Type leftType |
exists(
BinaryShiftOpOrAssignOp shift, Expr right, Type rightType,
MisraCpp23BuiltInTypes::NumericType leftType
|
right = shift.getRightOperand() and
x = right and
rightType = right.getExplicitlyConverted().getType() and
Expand All @@ -108,7 +113,7 @@ where
not isValidShiftConstantRange(right, leftType) and
message =
"Shift operator '" + shift.getOperator() + "' shifts by " + right.getValue().toInt() +
" which is not within the valid range 0.." + ((leftType.getSize() * 8) - 1) + "."
" which is not within the valid range 0.." + ((leftType.getBuiltInSize() * 8) - 1) + "."
else (
not MisraCpp23BuiltInTypes::isUnsignedType(rightType) and
message =
Expand Down
Loading