diff --git a/change_notes/2026-04-25-fix-performance-inappropriate-bitwise-or-shift-operands.md b/change_notes/2026-04-25-fix-performance-inappropriate-bitwise-or-shift-operands.md new file mode 100644 index 0000000000..3b7fee651f --- /dev/null +++ b/change_notes/2026-04-25-fix-performance-inappropriate-bitwise-or-shift-operands.md @@ -0,0 +1,5 @@ +- `RULE-6-4-2` - `InheritedOverridableMemberFunction.ql`: + - Improved evaluation performance. +- `RULE-7-0-4` - `InappropriateBitwiseOrShiftOperands.ql`: + - Improved evaluation performance. + - Removed false positives related to the `insertion operator`. diff --git a/cpp/common/src/codingstandards/cpp/rules/hiddeninheritedoverridablememberfunction/HiddenInheritedOverridableMemberFunction.qll b/cpp/common/src/codingstandards/cpp/rules/hiddeninheritedoverridablememberfunction/HiddenInheritedOverridableMemberFunction.qll index ef99e01973..3604c4756c 100644 --- a/cpp/common/src/codingstandards/cpp/rules/hiddeninheritedoverridablememberfunction/HiddenInheritedOverridableMemberFunction.qll +++ b/cpp/common/src/codingstandards/cpp/rules/hiddeninheritedoverridablememberfunction/HiddenInheritedOverridableMemberFunction.qll @@ -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. + 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 @@ -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 diff --git a/cpp/misra/src/rules/RULE-7-0-4/InappropriateBitwiseOrShiftOperands.ql b/cpp/misra/src/rules/RULE-7-0-4/InappropriateBitwiseOrShiftOperands.ql index e1f1e21069..9e1321134b 100644 --- a/cpp/misra/src/rules/RULE-7-0-4/InappropriateBitwiseOrShiftOperands.ql +++ b/cpp/misra/src/rules/RULE-7-0-4/InappropriateBitwiseOrShiftOperands.ql @@ -22,11 +22,13 @@ predicate isConstantExpression(Expr e) { e.isConstant() } -predicate isValidShiftConstantRange(Expr right, Type leftType) { +bindingset[right, leftType] +pragma[inline_late] +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 ) } @@ -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 @@ -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 =