This repository contains CodeQL queries and libraries which support various Coding Standards.
MIT License
Bot releases are visible (Hide)
STR32-C
- NonNullTerminatedToFunctionThatExpectsAString.ql
:
A2-10-1
, RULE-5-3
- IdentifierHiding.ql
, IdentifierHidingC.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 6 months ago
A2-10-1
, RULE-5-3
- IdentifierHiding.ql
, IdentifierHidingC.ql
:
M9-3-3
: MemberFunctionConstIfPossible.ql
:
A13-2-2
- BinaryOperatorAndBitwiseOperatorReturnAPrvalue.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 6 months ago
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 7 months ago
A3-3-1
- ExternalLinkageNotDeclaredInHeaderFile.ql
:
CTR55-CPP
- DoNotUseAnAdditiveOperatorOnAnIterator.ql
:
RULE-6-1
- BitFieldsShallOnlyBeDeclaredWithAnAppropriateType.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 7 months ago
A0-4-1
- FloatingPointImplementationShallComplyWithIeeeStandard.ql
:
getATypeUse
.A12-4-1
- DestructorOfABaseClassNotPublicVirtual.ql
:
A12-8-6
- CopyAndMoveNotDeclaredProtected.ql
:
A8-4-7
- InParametersForCheapToCopyTypesNotPassedByValue.ql
, InParametersForCheapToCopyTypesNotPassedByReference.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 7 months ago
New queries added for the following rule packages: Declarations, OrderOfEvaluation
The following changes have been made for this release:
M8-5-2
- AggregateLiteralEnhancements.qll
:
A7-1-5
- exclude auto variables initialized with an expression of non-fundamental type. Typically this occurs when using range based for loops with arrays of non-fundamental types. For example:
void iterate(Foo values[]) {
for (auto value : values) { // COMPLIANT (previously false positive)
// ...
}
}
A0-1-1
- address a number of false positive issues:
A15-4-4
: remove false positives reported on uninsantiated templates.A2-10-1
, RULE-5-3
:
M6-5-5
:
A7-1-1
- no longer report parameters as contravening this rule. This is inline with the rule intent as described in the referenced C++ Core Guidelines rule CON.1, which states "To avoid confusion and lots of false positives, don’t enforce this rule for function parameters."A2-7-3
- UndocumentedUserDefinedType.ql
:
M16-1-1
- DefinedPreProcessorOperatorGeneratedFromExpansionFound.ql
:
defined
operator after the start of the macro (e.g. #define X Y || defined(Z)
).A18-5-11
, A23-0-1
, A9-3-1
, M0-1-2
, M3-1-2
, M3-2-1
, M3-2-3
, M3-9-1
, M4-5-3
, M5-0-2
, M5-2-10
, A23-0-2
, CTR51-CPP
, STR52-CPP
A3-9-1
- VariableWidthIntegerTypesUsed.ql
:
signed char
and unsigned char
.A3-9-1
- VariableWidthPlainCharTypeUsed.ql
:
M5-3-3
- UnaryOperatorOverloaded.ql
:operator&
from this rule.M5-2-10
- IncrementAndDecrementOperatorsMixedWithOtherOperatorsInExpression.ql
:*p++
, which combine increment and dereferencing operations.A4-7-1
- exclude pointer increment and decrement operators from this rule.A2-3-1
: cpp/autosar/invalid-character-in-string-literal
RULE-7-3
: c/misra/lowercase-character-l-used-in-literal-suffix
false
literal.noexcept
functions, or calls functions with dynamic exception specifications where the exception is not permitted. This is consistent with the default behaviour specified in [expect.spec]
which indicates that std::terminate
is called. This has the following impact:
A15-4-2
, ERR55-CPP
- reduce false positives for noexcept
functions which call other noexcept
function which may throw.A15-2-2
- reduce false positives for constructors which call noexcept
functions.A15-4-5
- reduce false positives for checked exceptions that are thrown from noexcept
functions called by the original function.DCL57-CPP
- do not report exceptions thrown from noexcept
functions called by deallocation functions or destructors.A15-5-1
, M15-3-1
- do not report exceptions thrown from noexcept
functions called by special functions.M9-3-3
- MemberFunctionConstIfPossible.ql
, MemberFunctionStaticIfPossible.ql
:A8-4-7
- InParametersForCheapToCopyTypesNotPassedByValue.ql
, InParametersForNotCheapToCopyTypesNotPassedByReference.ql
:A5-0-2
- NonBooleanIfStmt.qll
, NonBooleanIterationStmt.qll
:A13-3-1
- FunctionThatContainsForwardingReferenceAsItsArgumentOverloaded.ql
:A4-7-1
: IntegerExpressionLeadToDataLoss.ql
/=
as a cause for data loss.A8-4-8
- OutParametersUsed.ql
FIO51-CPP
- CloseFilesWhenTheyAreNoLongerNeeded.ql
:
IStream
and OStream
types may result in reduced false negatives.A5-1-1
- LiteralValueUsedOutsideTypeInit.ql
:
IStream
types may result in reduced false positives because more file stream function calls may be detected as logging operations that will be excluded from the results.A16-0-1
- PreProcessorShallOnlyBeUsedForCertainDirectivesPatterns.ql
:
A4-5-1
: EnumUsedInArithmeticContexts.ql
:&
.&
.A7-1-2
- VariableMissingConstexpr.ql
:constexpr
functions are always compile-time evaluated.M9-3-3
: MemberFunctionConstIfPossible.ql
:A7-1-1
- DeclarationUnmodifiedObjectMissingConstSpecifier.ql
A2-10-4
- IdentifierNameOfStaticNonMemberObjectReusedInNamespace.ql
:
A18-0-1
- CLibraryFacilitiesNotAccessedThroughCPPLibraryHeaders.ql
:
M7-3-6
- UsingDeclarationsUsedInHeaderFiles.ql
:
A15-4-4
- MissingNoExcept.ql
:
std::string::reserve
or std::string::append
that may throw even if their signatures don't specify it.M0-1-4
- SingleUseMemberPODVariable.ql
:
M0-1-3
- UnusedMemberVariable.ql
, UnusedGlobalOrNamespaceVariable.ql
:
A5-1-1
- LiteralValueUsedOutsideTypeInit.ql
:
u
and U
prefixed char literals.A4-7-1
- IntegerExpressionLeadToDataLoss.ql
:
INT34-C
- ExprShiftedbyNegativeOrGreaterPrecisionOperand.ql
:
A5-0-2
- NonBooleanIterationCondition.ql
:
M5-3-1
- EachOperandOfTheOperatorTheLogicalAndOrTheLogicalOperatorsShallHaveTypeBool.ql
:
M5-14-1
- RightHandOperandOfALogicalAndOperatorsContainSideEffects.ql
:
A16-2-2
- UnusedIncludeDirectives.ql
:
A8-4-7
- InParametersForNotCheapToCopyTypesNotPassedByReference.ql
, InParametersForCheapToCopyTypesNotPassedByValue.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.New queries added to cover the following rules:
VariableWidthPlainCharTypeUsed.ql
InsufficientUseOfParentheses.ql
Published by github-actions[bot] 11 months ago
A7-3-1
- HiddenInheritedNonOverridableMemberFunction.ql
:
M5-0-20
, M5-0-21
, RULE-10-1
- exclude pointer assignment operators as bitwise operators.M5-0-20
- BitwiseOperatorOperandsHaveDifferentUnderlyingType.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] 11 months ago
A7-3-1
- HiddenInheritedNonOverridableMemberFunction.ql
:
M5-0-20
, M5-0-21
, RULE-10-1
- exclude pointer assignment operators as bitwise operators.M5-0-20
- BitwiseOperatorOperandsHaveDifferentUnderlyingType.ql
:
2.14.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.14.6
.Published by github-actions[bot] about 1 year ago
A0-1-3
- Considered the following additional use cases while reporting a local function as "unused".
2.13.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.13.5
.Published by github-actions[bot] about 1 year ago
FIO32-C
- DoNotPerformFileOperationsOnDevices.ql
:
A5-1-3
- Only consider lambdas that have zero arguments, since any lambda with non-zero arguments will have an explicit argument list.M0-1-3
- Consider constexpr variables used in template instantiations as "used".A8-4-13
A20-8-1
/MEM56-CPP
A18-1-4
STR51-CPP
std::string::replace()
function.A15-5-1
noalert(false)
special functions to clarify that this permits exceptions.noexcept(true)
special functions highlighting that the specification should be made explicit.2.12.7
.A15-2-2
- all results now include an associated exception flow path to avoid a CodeQL CLI bug in 2.12.7. This includes results where an exception is thrown directly in the constructor.2.12.7
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.12.7
.Published by github-actions[bot] about 1 year ago
2.11.6
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.11.6
.Published by github-actions[bot] over 1 year ago
2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.Published by github-actions[bot] over 1 year ago
A16-0-1
- reduce unneeded results related to #pragma
, as it's already reported by A16-7-1.DCL51-CPP
- reduce false positives related to use of __func__
A2-10-1
- reduce false positives for identifiers in same scope and relating to template variablesRULE-5-3
- reduce false positives for identifiers in same scopeA5-1-1
- reduce false positives by omitting literals written into file streams and wrappers around log and stream callsA14-7-2
- alert messages have been slightly adjusted to refer only to the base name of a file, not the full relative path.DCL56-CPP
- performance has been improved for databases with complex initializers.__func__
from certain queries, as it is the proscribed way to return the name of the current function:
A27-0-4
- Use of the value returned by __func__
is no longer flagged as a use of C-style strings.A18-1-1
- __func__
is no longer flagged as a declaration of a variable using C-style arrays.DCL51-CPP
- cpp/cert/use-of-single-underscore-reserved-prefix
- remove false positives which were compiler generated, such as the function _FUN
generated by the compiler for lambdas converted to function pointers.qcc
:A1-1-1
: restrict alerts to mentioned typesA5-2-5
: get type for value_type
A18-1-2
A18-1-3
A18-9-1
: support std inline namespaces (std::__1
)A23-0-1
A23-0-2
: functions in std
might be defined in inline namespacesM0-1-4
: removed test caseM6-5-2
: equality operator alternative implementationsM17-0-5
: longjmp
might be a macroCTR51-CPP
CTR53-CPP
ERR50-CPP
ERR52-CPP
STR52-CPP
: fixed by library changesMSC51-CPP
: time
can be in the global scopeSTR51-CPP
: String constructor might have 1 parameter.STR53-CPP
: compute initial container size for copy constructorA0-4-1
: numeric limits might be defined in __libcpp_numeric_limits
A0-4-3
: the rule now only checks the last -std
compilation flagisExcluded()
predicate
A2-13-3
A8-4-4
2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.Published by github-actions[bot] over 1 year ago
A15-4-4
- MissingNoExcept.ql
noexcept
or noexcept(false)
.A2-7-3
- UndocumentedUserDefinedType.ql
:
qcc
compiler and standard headers:
RULE-21-4
: longjmp
can be implmented as macroENV32-C
: exit functions can be implmented as macroERR33-C
FIO34-C
FIO46-C
RULE-22-6
: the library files ReadErrorsAndEOF.qll
DoNotAccessAClosedFile.qll
FileAccess.qll
have been updated to support different definitions of IO related functions and macrosRULE-10-6
: Fix output string formatSTR37-C
: add support for a different tolower/toupper
macro implementationEXP43-C
: add explicit support for library functions that are mentioned in the rule descriptionRULE-11-1
RULE-11-2
RULE-11-5
: support for a different NULL pointer definitionSTR38-C
: removed links to library internals in the output message2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.Published by github-actions[bot] over 1 year ago
2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.New queries added to cover the following rules:
StringFunctionPointerArgumentOutOfBounds.ql
StringLibrarySizeArgumentOutOfBounds.ql
New queries added to cover the following rules:
DoNotFormOutOfBoundsPointersOrArraySubscripts.ql
LibraryFunctionArgumentOutOfBounds.ql
Published by github-actions[bot] over 1 year ago
Rule 20.12
- the performance of this rule has been improved.Rule 5.8
Rule 8.7
M6-6-2
: Changed formatting of the alert message.M6-4-2
: Changed formatting of alert message.FIO42-C
- CloseFilesWhenTheyAreNoLongerNeeded.ql
:
where
clause, such that the exclusion mechanism only functioned for a certain subset of results.M5-19-1
:
M6-4-4
- alert message updated for clarity.A4-7-1
- IntegerExpressionLeadToDataLoss.ql
- reduce false positives and false negatives by:
2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.New queries added to cover the following rules:
PlainNumericalTypeUsedOverExplicitTypedef.ql
LanguageExtensionsShouldNotBeUsed.ql
OccurrenceOfUndefinedBehavior.ql
StringLiteralAssignedToNonConstChar.ql
RightHandOperandOfAShiftRange.ql
ConstantUnsignedIntegerExpressionsWrapAround.ql
SizeofOperatorUsedOnArrayTypeParam.ql
UnsequencedSideEffects.ql
ForLoopNotWellFormed.ql
ControllingExprInvariant.ql
NonBooleanIfCondition.ql
, NonBooleanIterationCondition.ql
GotoStatementUsed.ql
GotoLabelLocationCondition.ql
GotoLabelBlockCondition.ql
LoopIterationCondition.ql
FunctionReturnCondition.ql
SwitchCompoundCondition.ql
, LoopCompoundCondition.ql
, SelectionCompoundCondition.ql
IfElseEndCondition.ql
SwitchCaseStartCondition.ql
, SwitchStmtNotWellFormed.ql
NestSwitchLabelInSwitchStatement.ql
BreakShallTerminateSwitchClause.ql
EverySwitchShallHaveDefaultLabel.ql
DefaultNotFirstOrLastOfSwitch.ql
SwitchClauseNumberCondition.ql
SwitchExpressionBoolCondition.ql
RecursiveFunctionCondition.ql
NonVoidFunctionReturnCondition.ql
UseOfArrayStatic.ql
ObjectAssignedToAnOverlappingObject.ql
, ObjectCopiedToAnOverlappingObject.ql
CtypeFunctionArgNotUnsignedCharOrEof.ql
MemcpyMemmoveMemcmpArgNotPointersToCompatibleTypes.ql
FreeMemoryWhenNoLongerNeededMisra.ql
, CloseFileHandleWhenNoLongerNeededMisra.ql
OnlyFreeMemoryAllocatedDynamicallyMisra.ql
New queries added to cover the following rules:
VariableLengthArraySizeNotInValidRange.ql
DoNotSubtractPointersThatDoNotReferToTheSameArray.ql
, DoNotRelatePointersThatDoNotReferToTheSameArray.ql
DoNotUsePointerArithmeticOnNonArrayObjectPointers.ql
DoNotModifyObjectsWithTemporaryLifetime.ql
DoNotComparePaddingData.ql
FloatingPointLoopCounters.ql
UncheckedRangeDomainPoleErrors.ql
UncheckedFloatingPointConversion.ql
IntToFloatPreservePrecision.ql
MemcmpUsedToCompareFloats.ql
UnsignedIntegerOperationsWrapAround.ql
IntegerConversionCausesDataLoss.ql
SignedIntegerOverflow.ql
DivOrRemByZero.ql
ExprShiftedbyNegativeOrGreaterPrecisionOperand.ql
UseCorrectIntegerPrecisions.ql
ConvertingAPointerToIntegerOrIntegerToPointer.ql
FreeMemoryWhenNoLongerNeededCert.ql
AllocStructsWithAFlexibleArrayMemberDynamically.ql
, CopyStructsWithAFlexibleArrayMemberDynamically.ql
OnlyFreeMemoryAllocatedDynamicallyCert.ql
InsufficientMemoryAllocatedForObject.ql
DoNotModifyAlignmentOfMemoryWithRealloc.ql
DoNotPassInvalidDataToTheAsctimeFunction.ql
DoNotCallVaArgOnAVaListThatHasAnIndeterminateValue.ql
SideEffectsInArgumentsToUnsafeMacros.ql
CallOnlyAsyncSafeFunctionsWithinSignalHandlers.ql
DoNotAccessSharedObjectsInSignalHandlers.ql
DoNotCallSignalFromInterruptibleSignalHandlers.ql
DoNotReturnFromAComputationalExceptionHandler.ql
Published by github-actions[bot] over 1 year ago
Rule 10.1
Rule 10.2
Rule 10.3
Rule 10.4
Rule 10.5
Rule 10.6
Rule 10.7
Rule 10.8
Rule 14.1
Rule 21.14
Rule 21.16
2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.Published by github-actions[bot] over 1 year ago
A13-5-2
- address a false positive where lambda expressions with empty captures were being flagged as having a non-compliant conversion operator.A0-1-2
void
in C-style or assigned to std::ignore
.A0-1-4
[[maybe_unused]]
, or either cast to void
in C-style or assigned to std::ignore
in the function body.RULE-8-4
- CompatibleDeclarationObjectDefined.ql
2.10.5
.A2-10-4
- IdentifierNameOfStaticFunctionReusedInNamespace.ql
:
A2-10-4
- IdentifierNameOfStaticNonMemberObjectReusedInNamespace.ql
:
A2-10-5
- IdentifierNameOfStaticNonMemberObjectWithExternalOrInternalLinkageIsReused.ql
:
A5-2-2
CStyleCasts.ql
- exclude template parameters to avoid false positives when using the "functional notation" syntax. In addition, provide a greater explanation on limitations of this query.Rule 21.4
Rule 21.5
Rule 21.6
Rule 21.7
Rule 21.8
Rule 21.9
Rule 21.10
Rule 21.11
Rule 21.12
Rule 21.21
A13-2-2
- BinaryOperatorAndBitwiseOperatorReturnAPrvalue.ql
CON41-C
: Refactored to address compiler compatibility issues. More accurateatomic_compare_exchange_weak
and atomic_store
.CON40-C
: Refactored to address compiler compatibility issues. More accurateatomic_compare_exchange_weak
and atomic_store
.STR37-C
- reduce false negatives by improving detection when the <ctype>
functions are implemented using macros.2.10.5
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.10.5
.New queries added to cover the following rules:
InitializerForAggregateOrUnionNotEnclosedInBraces.ql
PartiallyInitializedArrayWithExplicitInitializers.ql
RepeatedInitializationOfAggregateObjectElement.ql
OperandsOfAnInappropriateEssentialType.ql
, PointerTypeOnLogicalOperator.ql
AdditionSubtractionOnEssentiallyCharType.ql
AssignmentOfIncompatibleEssentialType.ql
OperandsWithMismatchedEssentialTypeCategory.ql
InappropriateEssentialTypeCast.ql
AssignmentToWiderEssentialType.ql
ImplicitConversionOfCompositeExpression.ql
InappropriateCastOfCompositeExpression.ql
LoopOverEssentiallyFloatType.ql
MemcmpUsedToCompareNullTerminatedStrings.ql
MemcmpOnInappropriateEssentialTypeArgs.ql
Published by github-actions[bot] over 1 year ago
RULE-11-7
- CastBetweenPointerToObjectAndNonIntArithmeticType.ql
A1-1-2
: Refactored this test case to support better cross-compiler testing.A1-1-3
: Added support for alternate spelling of compiler flag.2.9.4
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.9.4
.New queries added to cover the following rules:
BitFieldsShallOnlyBeDeclaredWithAnAppropriateType.ql
SingleBitNamedBitFieldsOfASignedType.ql
ValueImplicitEnumerationConstantNotUnique.ql
ObjectWithAutoStorageDurationReadBeforeInit.ql
ArrayFunctionArgumentNumberOfElements.ql
ValueReturnedByAFunctionNotUsed.ql
VariableLengthArrayTypesUsed.ql
New queries added to cover the following rules:
AppropriateStorageDurationsStackAdressEscape.ql
, AppropriateStorageDurationsFunctionReturn.ql
InformationLeakageAcrossTrustBoundariesC.ql
DoNotAccessVolatileObjectWithNonVolatileReference.ql
DoNotReadUninitializedMemory.ql
DoNotDereferenceNullPointers.ql
DoNotCastPointerToMoreStrictlyAlignedPointerType.ql
DoNotAccessVariableViaPointerOfIncompatibleType.ql
DoNotModifyConstantObjects.ql
DoNotPassAliasedPointerToRestrictQualifiedParam.ql
, RestrictPointerReferencesOverlappingObject.ql
DoNotAccessFreedMemory.ql
2.9.4
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.9.4
.Published by github-actions[bot] almost 2 years ago
M0-1-9
: This query previously excluded all results which were affected by a macro expansion. This is because a macro may be expanded multiple times with code that is dead in one expansion but live in another. This query has been modified to exclude results only where the entirety of a statement is generated by a macro. This reduces false negatives where the statements liveness is not affected by the macro expansion.2.9.4
in conjunction with a copy of the CodeQL standard library for C++ (github/codeql
) set to the tag codeql-cli/v2.9.4
.New queries added to cover the following rules:
UnreachableCode.ql
DeadCode.ql
UnusedTypeDeclarations.ql
UnusedTagDeclaration.ql
UnusedMacroDeclaration.ql
UnusedLabelDeclaration.ql
UnusedParameter.ql
IdentifiersDeclaredInTheSameScopeNotDistinct.ql
IdentifiersWithExternalLinkageNotUnique.ql
IdentifiersWithInternalLinkageNotUnique.ql
FunctionTypesNotInPrototypeForm.ql
DeclarationsOfAnObjectSameNameAndType.ql
, DeclarationsOfAFunctionSameNameAndType.ql
CompatibleDeclarationObjectDefined.ql
, CompatibleDeclarationFunctionDefined.ql
ExternalObjectOrFunctionNotDeclaredInOneFile.ql
IdentifierWithExternalLinkageOneDefinition.ql
ShouldNotBeDefinedWithExternalLinkage.ql
MissingStaticSpecifierFunctionRedeclarationC.ql
, MissingStaticSpecifierObjectRedeclarationC.ql
UnnecessaryExposedIdentifierDeclarationC.ql
InlineFunctionNotDeclaredStaticStorage.ql
ArrayExternalLinkageSizeExplicitlySpecified.ql
FunctionDeclaredImplicitly.ql
FlexibleArrayMembersDeclared.ql
New queries added to cover the following rules:
DoNotRelyOnIndeterminateValuesOfErrno.ql
DetectAndHandleStandardLibraryErrors.ql