diff --git a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected index b93829875d20..960972c508c8 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected @@ -1,8 +1,99 @@ +ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql +ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql +ql/python/ql/src/Classes/EqualsOrHash.ql +ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql +ql/python/ql/src/Classes/MissingCallToDel.ql +ql/python/ql/src/Classes/MissingCallToInit.ql +ql/python/ql/src/Classes/MutatingDescriptor.ql +ql/python/ql/src/Classes/SubclassShadowing.ql +ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql +ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql +ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql +ql/python/ql/src/Exceptions/CatchingBaseException.ql +ql/python/ql/src/Exceptions/EmptyExcept.ql +ql/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql +ql/python/ql/src/Exceptions/IllegalRaise.ql +ql/python/ql/src/Exceptions/IncorrectExceptOrder.ql +ql/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql +ql/python/ql/src/Expressions/CallToSuperWrongClass.ql +ql/python/ql/src/Expressions/CompareConstants.ql +ql/python/ql/src/Expressions/CompareIdenticalValues.ql +ql/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql +ql/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql +ql/python/ql/src/Expressions/ContainsNonContainer.ql +ql/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql +ql/python/ql/src/Expressions/EqualsNone.ql +ql/python/ql/src/Expressions/ExpectedMappingForFormatString.ql +ql/python/ql/src/Expressions/ExplicitCallToDel.ql +ql/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql +ql/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql +ql/python/ql/src/Expressions/HashedButNoHash.ql +ql/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql +ql/python/ql/src/Expressions/NonCallableCalled.ql +ql/python/ql/src/Expressions/Regex/BackspaceEscape.ql +ql/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql +ql/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql +ql/python/ql/src/Expressions/Regex/UnmatchableCaret.ql +ql/python/ql/src/Expressions/Regex/UnmatchableDollar.ql +ql/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql +ql/python/ql/src/Expressions/UnnecessaryLambda.ql +ql/python/ql/src/Expressions/UnsupportedFormatCharacter.ql +ql/python/ql/src/Expressions/WrongNameForArgumentInCall.ql +ql/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql +ql/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql +ql/python/ql/src/Functions/ConsistentReturns.ql +ql/python/ql/src/Functions/ExplicitReturnInInit.ql +ql/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql +ql/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql +ql/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql +ql/python/ql/src/Functions/InitIsGenerator.ql +ql/python/ql/src/Functions/IterReturnsNonIterator.ql ql/python/ql/src/Functions/IterReturnsNonSelf.ql +ql/python/ql/src/Functions/ModificationOfParameterWithDefault.ql ql/python/ql/src/Functions/NonCls.ql ql/python/ql/src/Functions/NonSelf.ql +ql/python/ql/src/Functions/OverlyComplexDelMethod.ql ql/python/ql/src/Functions/ReturnConsistentTupleSizes.ql +ql/python/ql/src/Functions/SignatureOverriddenMethod.ql ql/python/ql/src/Functions/SignatureSpecialMethods.ql +ql/python/ql/src/Functions/UseImplicitNoneReturnValue.ql +ql/python/ql/src/Imports/EncodingError.ql +ql/python/ql/src/Imports/ImportandImportFrom.ql +ql/python/ql/src/Imports/ModuleImportsItself.ql +ql/python/ql/src/Imports/MultipleImports.ql +ql/python/ql/src/Imports/SyntaxError.ql +ql/python/ql/src/Imports/UnintentionalImport.ql +ql/python/ql/src/Imports/UnusedImport.ql +ql/python/ql/src/Lexical/CommentedOutCode.ql ql/python/ql/src/Resources/FileNotAlwaysClosed.ql +ql/python/ql/src/Statements/AssertOnTuple.ql +ql/python/ql/src/Statements/ConstantInConditional.ql +ql/python/ql/src/Statements/IterableStringOrSequence.ql +ql/python/ql/src/Statements/MismatchInMultipleAssignment.ql +ql/python/ql/src/Statements/ModificationOfLocals.ql +ql/python/ql/src/Statements/NestedLoopsSameVariable.ql +ql/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql +ql/python/ql/src/Statements/NonIteratorInForLoop.ql +ql/python/ql/src/Statements/RedundantAssignment.ql +ql/python/ql/src/Statements/ShouldUseWithStatement.ql +ql/python/ql/src/Statements/SideEffectInAssert.ql +ql/python/ql/src/Statements/StatementNoEffect.ql +ql/python/ql/src/Statements/TopLevelPrint.ql +ql/python/ql/src/Statements/UnnecessaryElseClause.ql +ql/python/ql/src/Statements/UnnecessaryPass.ql +ql/python/ql/src/Statements/UnreachableCode.ql +ql/python/ql/src/Statements/UnusedExceptionObject.ql +ql/python/ql/src/Statements/UseOfExit.ql +ql/python/ql/src/Testing/ImpreciseAssert.ql +ql/python/ql/src/Variables/GlobalAtModuleLevel.ql ql/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql +ql/python/ql/src/Variables/MultiplyDefined.ql +ql/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql +ql/python/ql/src/Variables/UndefinedExport.ql +ql/python/ql/src/Variables/UnusedLocalVariable.ql +ql/python/ql/src/Variables/UnusedModuleVariable.ql diff --git a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected index b93829875d20..960972c508c8 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected @@ -1,8 +1,99 @@ +ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql +ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql +ql/python/ql/src/Classes/EqualsOrHash.ql +ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql +ql/python/ql/src/Classes/MissingCallToDel.ql +ql/python/ql/src/Classes/MissingCallToInit.ql +ql/python/ql/src/Classes/MutatingDescriptor.ql +ql/python/ql/src/Classes/SubclassShadowing.ql +ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql +ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql +ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql +ql/python/ql/src/Exceptions/CatchingBaseException.ql +ql/python/ql/src/Exceptions/EmptyExcept.ql +ql/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql +ql/python/ql/src/Exceptions/IllegalRaise.ql +ql/python/ql/src/Exceptions/IncorrectExceptOrder.ql +ql/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql +ql/python/ql/src/Expressions/CallToSuperWrongClass.ql +ql/python/ql/src/Expressions/CompareConstants.ql +ql/python/ql/src/Expressions/CompareIdenticalValues.ql +ql/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql +ql/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql +ql/python/ql/src/Expressions/ContainsNonContainer.ql +ql/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql +ql/python/ql/src/Expressions/EqualsNone.ql +ql/python/ql/src/Expressions/ExpectedMappingForFormatString.ql +ql/python/ql/src/Expressions/ExplicitCallToDel.ql +ql/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql +ql/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql +ql/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql +ql/python/ql/src/Expressions/HashedButNoHash.ql +ql/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql +ql/python/ql/src/Expressions/NonCallableCalled.ql +ql/python/ql/src/Expressions/Regex/BackspaceEscape.ql +ql/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql +ql/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql +ql/python/ql/src/Expressions/Regex/UnmatchableCaret.ql +ql/python/ql/src/Expressions/Regex/UnmatchableDollar.ql +ql/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql +ql/python/ql/src/Expressions/UnnecessaryLambda.ql +ql/python/ql/src/Expressions/UnsupportedFormatCharacter.ql +ql/python/ql/src/Expressions/WrongNameForArgumentInCall.ql +ql/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql +ql/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql +ql/python/ql/src/Functions/ConsistentReturns.ql +ql/python/ql/src/Functions/ExplicitReturnInInit.ql +ql/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql +ql/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql +ql/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql +ql/python/ql/src/Functions/InitIsGenerator.ql +ql/python/ql/src/Functions/IterReturnsNonIterator.ql ql/python/ql/src/Functions/IterReturnsNonSelf.ql +ql/python/ql/src/Functions/ModificationOfParameterWithDefault.ql ql/python/ql/src/Functions/NonCls.ql ql/python/ql/src/Functions/NonSelf.ql +ql/python/ql/src/Functions/OverlyComplexDelMethod.ql ql/python/ql/src/Functions/ReturnConsistentTupleSizes.ql +ql/python/ql/src/Functions/SignatureOverriddenMethod.ql ql/python/ql/src/Functions/SignatureSpecialMethods.ql +ql/python/ql/src/Functions/UseImplicitNoneReturnValue.ql +ql/python/ql/src/Imports/EncodingError.ql +ql/python/ql/src/Imports/ImportandImportFrom.ql +ql/python/ql/src/Imports/ModuleImportsItself.ql +ql/python/ql/src/Imports/MultipleImports.ql +ql/python/ql/src/Imports/SyntaxError.ql +ql/python/ql/src/Imports/UnintentionalImport.ql +ql/python/ql/src/Imports/UnusedImport.ql +ql/python/ql/src/Lexical/CommentedOutCode.ql ql/python/ql/src/Resources/FileNotAlwaysClosed.ql +ql/python/ql/src/Statements/AssertOnTuple.ql +ql/python/ql/src/Statements/ConstantInConditional.ql +ql/python/ql/src/Statements/IterableStringOrSequence.ql +ql/python/ql/src/Statements/MismatchInMultipleAssignment.ql +ql/python/ql/src/Statements/ModificationOfLocals.ql +ql/python/ql/src/Statements/NestedLoopsSameVariable.ql +ql/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql +ql/python/ql/src/Statements/NonIteratorInForLoop.ql +ql/python/ql/src/Statements/RedundantAssignment.ql +ql/python/ql/src/Statements/ShouldUseWithStatement.ql +ql/python/ql/src/Statements/SideEffectInAssert.ql +ql/python/ql/src/Statements/StatementNoEffect.ql +ql/python/ql/src/Statements/TopLevelPrint.ql +ql/python/ql/src/Statements/UnnecessaryElseClause.ql +ql/python/ql/src/Statements/UnnecessaryPass.ql +ql/python/ql/src/Statements/UnreachableCode.ql +ql/python/ql/src/Statements/UnusedExceptionObject.ql +ql/python/ql/src/Statements/UseOfExit.ql +ql/python/ql/src/Testing/ImpreciseAssert.ql +ql/python/ql/src/Variables/GlobalAtModuleLevel.ql ql/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql +ql/python/ql/src/Variables/MultiplyDefined.ql +ql/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql +ql/python/ql/src/Variables/UndefinedExport.ql +ql/python/ql/src/Variables/UnusedLocalVariable.ql +ql/python/ql/src/Variables/UnusedModuleVariable.ql diff --git a/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql b/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql index 34a9e133075c..947c547c0500 100644 --- a/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql +++ b/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql @@ -2,9 +2,9 @@ * @name Conflicting attributes in base classes * @description When a class subclasses multiple base classes and more than one base class defines the same attribute, attribute overriding may result in unexpected behavior by instances of this class. * @kind problem - * @tags reliability - * maintainability - * modularity + * @tags quality + * reliability + * correctness * @problem.severity warning * @sub-severity low * @precision high diff --git a/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql b/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql index e3101e7f6c08..f6829b237a8e 100644 --- a/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql +++ b/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql @@ -2,7 +2,8 @@ * @name `__eq__` not overridden when adding attributes * @description When adding new attributes to instances of a class, equality for that class needs to be defined. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Classes/EqualsOrHash.ql b/python/ql/src/Classes/EqualsOrHash.ql index 26be0c2ec43e..4c8cf2c11699 100644 --- a/python/ql/src/Classes/EqualsOrHash.ql +++ b/python/ql/src/Classes/EqualsOrHash.ql @@ -2,7 +2,8 @@ * @name Inconsistent equality and hashing * @description Defining equality for a class without also defining hashability (or vice-versa) violates the object model. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-581 * @problem.severity warning diff --git a/python/ql/src/Classes/InconsistentMRO.ql b/python/ql/src/Classes/InconsistentMRO.ql index 90c1d3869386..b479f86ec557 100644 --- a/python/ql/src/Classes/InconsistentMRO.ql +++ b/python/ql/src/Classes/InconsistentMRO.ql @@ -2,7 +2,8 @@ * @name Inconsistent method resolution order * @description Class definition will raise a type error at runtime due to inconsistent method resolution order(MRO) * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity high diff --git a/python/ql/src/Classes/MissingCallToDel.ql b/python/ql/src/Classes/MissingCallToDel.ql index 641968789d62..be49dc48b5f4 100644 --- a/python/ql/src/Classes/MissingCallToDel.ql +++ b/python/ql/src/Classes/MissingCallToDel.ql @@ -2,8 +2,10 @@ * @name Missing call to `__del__` during object destruction * @description An omitted call to a super-class `__del__` method may lead to class instances not being cleaned up properly. * @kind problem - * @tags efficiency + * @tags quality + * reliability * correctness + * performance * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Classes/MissingCallToInit.ql b/python/ql/src/Classes/MissingCallToInit.ql index 81d1916056ef..4f5d3d90e84a 100644 --- a/python/ql/src/Classes/MissingCallToInit.ql +++ b/python/ql/src/Classes/MissingCallToInit.ql @@ -2,7 +2,8 @@ * @name Missing call to `__init__` during object initialization * @description An omitted call to a super-class `__init__` method may lead to objects of this class not being fully initialized. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Classes/MutatingDescriptor.ql b/python/ql/src/Classes/MutatingDescriptor.ql index 477ecc18206a..aad468f8e3c3 100644 --- a/python/ql/src/Classes/MutatingDescriptor.ql +++ b/python/ql/src/Classes/MutatingDescriptor.ql @@ -2,7 +2,8 @@ * @name Mutation of descriptor in `__get__` or `__set__` method. * @description Descriptor objects can be shared across many instances. Mutating them can cause strange side effects or race conditions. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Classes/SubclassShadowing.ql b/python/ql/src/Classes/SubclassShadowing.ql index 974230709bbf..542cf31c76aa 100644 --- a/python/ql/src/Classes/SubclassShadowing.ql +++ b/python/ql/src/Classes/SubclassShadowing.ql @@ -4,7 +4,8 @@ * method, hides the method in the subclass. * @kind problem * @problem.severity error - * @tags maintainability + * @tags quality + * reliability * correctness * @sub-severity low * @precision high diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql index da301b6422ab..019da4257aa0 100644 --- a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql +++ b/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql @@ -2,7 +2,8 @@ * @name Multiple calls to `__del__` during object destruction * @description A duplicated call to a super-class `__del__` method may lead to class instances not be cleaned up properly. * @kind problem - * @tags efficiency + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql index ec94202c0f33..6251ef274dac 100644 --- a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql +++ b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql @@ -2,7 +2,8 @@ * @name Multiple calls to `__init__` during object initialization * @description A duplicated call to a super-class `__init__` method may lead to objects of this class not being properly initialized. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql b/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql index 73631a134c88..1de99ebdbf61 100644 --- a/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql +++ b/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql @@ -4,7 +4,8 @@ * parameter of the __init__ method of the class being * instantiated, will result in a TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-628 * @problem.severity error diff --git a/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql b/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql index 8b456c91dced..8518905f3a90 100644 --- a/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql +++ b/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql @@ -3,7 +3,8 @@ * @description Using too many or too few arguments in a call to the `__init__` * method of a class will result in a TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-685 * @problem.severity error diff --git a/python/ql/src/Exceptions/CatchingBaseException.ql b/python/ql/src/Exceptions/CatchingBaseException.ql index 5205af33441b..79174488760b 100644 --- a/python/ql/src/Exceptions/CatchingBaseException.ql +++ b/python/ql/src/Exceptions/CatchingBaseException.ql @@ -2,9 +2,9 @@ * @name Except block handles 'BaseException' * @description Handling 'BaseException' means that system exits and keyboard interrupts may be mis-handled. * @kind problem - * @tags reliability - * readability - * convention + * @tags quality + * reliability + * error-handling * external/cwe/cwe-396 * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Exceptions/EmptyExcept.ql b/python/ql/src/Exceptions/EmptyExcept.ql index bfd0915a783e..e1bbb29cf8ba 100644 --- a/python/ql/src/Exceptions/EmptyExcept.ql +++ b/python/ql/src/Exceptions/EmptyExcept.ql @@ -2,8 +2,9 @@ * @name Empty except * @description Except doesn't do anything and has no comment * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * error-handling * external/cwe/cwe-390 * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql b/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql index 61850b2c0d1c..2bf97b469ee0 100644 --- a/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql +++ b/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql @@ -2,9 +2,9 @@ * @name Non-exception in 'except' clause * @description An exception handler specifying a non-exception type will never handle any exception. * @kind problem - * @tags reliability - * correctness - * types + * @tags quality + * reliability + * error-handling * @problem.severity error * @sub-severity low * @precision very-high diff --git a/python/ql/src/Exceptions/IllegalRaise.ql b/python/ql/src/Exceptions/IllegalRaise.ql index 7d8e89874107..04319e246ed1 100644 --- a/python/ql/src/Exceptions/IllegalRaise.ql +++ b/python/ql/src/Exceptions/IllegalRaise.ql @@ -2,9 +2,9 @@ * @name Illegal raise * @description Raising a non-exception object or type will result in a TypeError being raised instead. * @kind problem - * @tags reliability - * correctness - * types + * @tags quality + * reliability + * error-handling * @problem.severity error * @sub-severity high * @precision very-high diff --git a/python/ql/src/Exceptions/IncorrectExceptOrder.ql b/python/ql/src/Exceptions/IncorrectExceptOrder.ql index 0b57dd4659d1..3c0c90b36d35 100644 --- a/python/ql/src/Exceptions/IncorrectExceptOrder.ql +++ b/python/ql/src/Exceptions/IncorrectExceptOrder.ql @@ -3,8 +3,9 @@ * @description Handling general exceptions before specific exceptions means that the specific * handlers are never executed. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * error-handling * external/cwe/cwe-561 * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql b/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql index 933d15ddf60e..80dcd6f0dbea 100644 --- a/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql +++ b/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql @@ -6,8 +6,9 @@ * @sub-severity high * @precision very-high * @id py/raise-not-implemented - * @tags reliability - * maintainability + * @tags quality + * reliability + * error-handling */ import python diff --git a/python/ql/src/Expressions/CallToSuperWrongClass.ql b/python/ql/src/Expressions/CallToSuperWrongClass.ql index af5c33ef13ab..10a1435ac317 100644 --- a/python/ql/src/Expressions/CallToSuperWrongClass.ql +++ b/python/ql/src/Expressions/CallToSuperWrongClass.ql @@ -2,9 +2,9 @@ * @name First argument to super() is not enclosing class * @description Calling super with something other than the enclosing class may cause incorrect object initialization. * @kind problem - * @tags reliability - * maintainability - * convention + * @tags quality + * reliability + * correctness * external/cwe/cwe-687 * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/CompareConstants.ql b/python/ql/src/Expressions/CompareConstants.ql index d2d8f827dc0f..4b06e0a2a6e2 100644 --- a/python/ql/src/Expressions/CompareConstants.ql +++ b/python/ql/src/Expressions/CompareConstants.ql @@ -2,7 +2,8 @@ * @name Comparison of constants * @description Comparison of constants is always constant, but is harder to read than a simple constant. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-570 * external/cwe/cwe-571 diff --git a/python/ql/src/Expressions/CompareIdenticalValues.ql b/python/ql/src/Expressions/CompareIdenticalValues.ql index c950d3ebb2ee..705f715df6c5 100644 --- a/python/ql/src/Expressions/CompareIdenticalValues.ql +++ b/python/ql/src/Expressions/CompareIdenticalValues.ql @@ -2,10 +2,9 @@ * @name Comparison of identical values * @description Comparison of identical values, the intent of which is unclear. * @kind problem - * @tags reliability - * correctness + * @tags quality + * maintainability * readability - * convention * external/cwe/cwe-570 * external/cwe/cwe-571 * @problem.severity warning diff --git a/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql b/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql index 554d7a087b66..fc63e5709999 100644 --- a/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql +++ b/python/ql/src/Expressions/CompareIdenticalValuesMissingSelf.ql @@ -2,8 +2,9 @@ * @name Maybe missing 'self' in comparison * @description Comparison of identical values, the intent of which is unclear. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * external/cwe/cwe-570 * external/cwe/cwe-571 * @problem.severity warning diff --git a/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql b/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql index 3bd5f84fc67f..c681a141cc56 100644 --- a/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql +++ b/python/ql/src/Expressions/Comparisons/UselessComparisonTest.ql @@ -2,7 +2,9 @@ * @name Redundant comparison * @description The result of a comparison is implied by a previous comparison. * @kind problem - * @tags useless-code + * @tags quality + * maintainability + * useless-code * external/cwe/cwe-561 * external/cwe/cwe-570 * external/cwe/cwe-571 diff --git a/python/ql/src/Expressions/ContainsNonContainer.ql b/python/ql/src/Expressions/ContainsNonContainer.ql index 87a3866085cb..cf6af5ce7b18 100644 --- a/python/ql/src/Expressions/ContainsNonContainer.ql +++ b/python/ql/src/Expressions/ContainsNonContainer.ql @@ -2,7 +2,8 @@ * @name Membership test with a non-container * @description A membership test, such as 'item in sequence', with a non-container on the right hand side will raise a 'TypeError'. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity high diff --git a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql index 7a5399700ec7..166eae635fad 100644 --- a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql +++ b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.ql @@ -2,7 +2,8 @@ * @name Duplicate key in dict literal * @description Duplicate key in dict literal. All but the last will be lost. * @kind problem - * @tags reliability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-561 * @problem.severity warning diff --git a/python/ql/src/Expressions/EqualsNone.ql b/python/ql/src/Expressions/EqualsNone.ql index fa36dffb7248..8a2878c3b8ab 100644 --- a/python/ql/src/Expressions/EqualsNone.ql +++ b/python/ql/src/Expressions/EqualsNone.ql @@ -2,8 +2,10 @@ * @name Testing equality to None * @description Testing whether an object is 'None' using the == operator is inefficient and potentially incorrect. * @kind problem - * @tags efficiency - * maintainability + * @tags quality + * reliability + * correctness + * performance * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Expressions/ExpectedMappingForFormatString.ql b/python/ql/src/Expressions/ExpectedMappingForFormatString.ql index 76d2f874779f..4342062270b7 100644 --- a/python/ql/src/Expressions/ExpectedMappingForFormatString.ql +++ b/python/ql/src/Expressions/ExpectedMappingForFormatString.ql @@ -2,7 +2,8 @@ * @name Formatted object is not a mapping * @description The formatted object must be a mapping when the format includes a named specifier; otherwise a TypeError will be raised." * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/ExplicitCallToDel.ql b/python/ql/src/Expressions/ExplicitCallToDel.ql index f60945ba05cf..44011aa43b08 100644 --- a/python/ql/src/Expressions/ExplicitCallToDel.ql +++ b/python/ql/src/Expressions/ExplicitCallToDel.ql @@ -2,7 +2,8 @@ * @name `__del__` is called explicitly * @description The `__del__` special method is called by the virtual machine when an object is being finalized. It should not be called explicitly. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql b/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql index a52fada69b02..1f77542eb904 100644 --- a/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql +++ b/python/ql/src/Expressions/Formatting/MixedExplicitImplicitIn3101Format.ql @@ -3,7 +3,8 @@ * @description Using implicit and explicit numbering in string formatting operations, such as '"{}: {1}".format(a,b)', will raise a ValueError. * @kind problem * @problem.severity error - * @tags reliability + * @tags quality + * reliability * correctness * @sub-severity low * @precision high diff --git a/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql b/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql index d8e1f0af1b41..9c8b83a680c5 100644 --- a/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql +++ b/python/ql/src/Expressions/Formatting/UnusedArgumentIn3101Format.ql @@ -2,7 +2,8 @@ * @name Unused argument in a formatting call * @description Including surplus arguments in a formatting call makes code more difficult to read and may indicate an error. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql b/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql index d5aac3aaab20..e8aa7f07e8b3 100644 --- a/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql +++ b/python/ql/src/Expressions/Formatting/UnusedNamedArgumentIn3101Format.ql @@ -2,7 +2,8 @@ * @name Unused named argument in formatting call * @description Including surplus keyword arguments in a formatting call makes code more difficult to read and may indicate an error. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql b/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql index 1cc1e4a94558..1dfab9c79b26 100644 --- a/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql +++ b/python/ql/src/Expressions/Formatting/WrongNameInArgumentsFor3101Format.ql @@ -4,7 +4,8 @@ * where the names of format items in the format string differs from the names of the values to be formatted will raise a KeyError. * @kind problem * @problem.severity error - * @tags reliability + * @tags quality + * reliability * correctness * @sub-severity low * @precision high diff --git a/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql b/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql index e120cd6b5bb8..70c5290bf4b7 100644 --- a/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql +++ b/python/ql/src/Expressions/Formatting/WrongNumberArgumentsFor3101Format.ql @@ -3,7 +3,8 @@ * @description A string formatting operation, such as '"{0}: {1}, {2}".format(a,b)', * where the number of values to be formatted is too few for the format string will raise an IndexError. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/HashedButNoHash.ql b/python/ql/src/Expressions/HashedButNoHash.ql index 336c344fa379..eb86f3b55332 100644 --- a/python/ql/src/Expressions/HashedButNoHash.ql +++ b/python/ql/src/Expressions/HashedButNoHash.ql @@ -2,7 +2,8 @@ * @name Unhashable object hashed * @description Hashing an object which is not hashable will result in a TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql b/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql index a60430aa4c1c..6eda4abbde21 100644 --- a/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql +++ b/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql @@ -2,7 +2,8 @@ * @name Comparison using is when operands support `__eq__` * @description Comparison using 'is' when equivalence is not the same as identity * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Expressions/NonCallableCalled.ql b/python/ql/src/Expressions/NonCallableCalled.ql index aed13af8f638..2740dbe5fb26 100644 --- a/python/ql/src/Expressions/NonCallableCalled.ql +++ b/python/ql/src/Expressions/NonCallableCalled.ql @@ -2,9 +2,9 @@ * @name Non-callable called * @description A call to an object which is not a callable will raise a TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness - * types * @problem.severity error * @sub-severity high * @precision high diff --git a/python/ql/src/Expressions/Regex/BackspaceEscape.ql b/python/ql/src/Expressions/Regex/BackspaceEscape.ql index e67ced94312f..f23d3e0e07cf 100644 --- a/python/ql/src/Expressions/Regex/BackspaceEscape.ql +++ b/python/ql/src/Expressions/Regex/BackspaceEscape.ql @@ -3,7 +3,9 @@ * @description Using '\b' to escape the backspace character in a regular expression is confusing * since it could be mistaken for a word boundary assertion. * @kind problem - * @tags maintainability + * @tags quality + * maintainability + * readability * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql b/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql index 1c7cfc39de99..9f7f20a4f3ee 100644 --- a/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql +++ b/python/ql/src/Expressions/Regex/DuplicateCharacterInSet.ql @@ -2,7 +2,8 @@ * @name Duplication in regular expression character class * @description Duplicate characters in a class have no effect and may indicate an error in the regular expression. * @kind problem - * @tags reliability + * @tags quality + * maintainability * readability * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql b/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql index e03fc65518a1..36709cee1378 100644 --- a/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql +++ b/python/ql/src/Expressions/Regex/MissingPartSpecialGroup.ql @@ -2,7 +2,8 @@ * @name Missing part of special group in regular expression * @description Incomplete special groups are parsed as normal groups and are unlikely to match the intended strings. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Expressions/Regex/UnmatchableCaret.ql b/python/ql/src/Expressions/Regex/UnmatchableCaret.ql index 0dcf88a5d089..106bd8eedf8d 100644 --- a/python/ql/src/Expressions/Regex/UnmatchableCaret.ql +++ b/python/ql/src/Expressions/Regex/UnmatchableCaret.ql @@ -2,7 +2,8 @@ * @name Unmatchable caret in regular expression * @description Regular expressions containing a caret '^' in the middle cannot be matched, whatever the input. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/Regex/UnmatchableDollar.ql b/python/ql/src/Expressions/Regex/UnmatchableDollar.ql index 00b14998a044..dcc78c3730a5 100644 --- a/python/ql/src/Expressions/Regex/UnmatchableDollar.ql +++ b/python/ql/src/Expressions/Regex/UnmatchableDollar.ql @@ -2,7 +2,8 @@ * @name Unmatchable dollar in regular expression * @description Regular expressions containing a dollar '$' in the middle cannot be matched, whatever the input. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql b/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql index f653db40571d..06528f1d7547 100644 --- a/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql +++ b/python/ql/src/Expressions/UnintentionalImplicitStringConcatenation.ql @@ -2,9 +2,9 @@ * @name Implicit string concatenation in a list * @description Omitting a comma between strings causes implicit concatenation which is confusing in a list. * @kind problem - * @tags reliability + * @tags quality * maintainability - * convention + * readability * external/cwe/cwe-665 * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Expressions/UnnecessaryLambda.ql b/python/ql/src/Expressions/UnnecessaryLambda.ql index 7486e27d6952..5ba2dd171240 100644 --- a/python/ql/src/Expressions/UnnecessaryLambda.ql +++ b/python/ql/src/Expressions/UnnecessaryLambda.ql @@ -2,7 +2,8 @@ * @name Unnecessary lambda * @description A lambda is used that calls through to a function without modifying any parameters * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Expressions/UnsupportedFormatCharacter.ql b/python/ql/src/Expressions/UnsupportedFormatCharacter.ql index d3876725233a..ff99a87487a4 100644 --- a/python/ql/src/Expressions/UnsupportedFormatCharacter.ql +++ b/python/ql/src/Expressions/UnsupportedFormatCharacter.ql @@ -2,7 +2,8 @@ * @name Unsupported format character * @description An unsupported format character in a format string * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Expressions/WrongNameForArgumentInCall.ql b/python/ql/src/Expressions/WrongNameForArgumentInCall.ql index 053b0ef2ad20..21403c51c610 100644 --- a/python/ql/src/Expressions/WrongNameForArgumentInCall.ql +++ b/python/ql/src/Expressions/WrongNameForArgumentInCall.ql @@ -4,7 +4,8 @@ * parameter of the called function or method, will result in a * TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-628 * @problem.severity error diff --git a/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql b/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql index 2a6d3f62be86..e47d4a55bf5d 100644 --- a/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql +++ b/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql @@ -3,7 +3,8 @@ * @description A string formatting operation, such as '"%s: %s, %s" % (a,b)', where the number of conversion specifiers in the * format string differs from the number of values to be formatted will raise a TypeError. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-685 * @problem.severity error diff --git a/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql b/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql index ffebb000034f..bde54558c9bd 100644 --- a/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql +++ b/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql @@ -2,7 +2,8 @@ * @name Wrong number of arguments in a call * @description Using too many or too few arguments in a call to a function will result in a TypeError at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * external/cwe/cwe-685 * @problem.severity error diff --git a/python/ql/src/Functions/ConsistentReturns.ql b/python/ql/src/Functions/ConsistentReturns.ql index f9d81c63936f..a1b308514562 100644 --- a/python/ql/src/Functions/ConsistentReturns.ql +++ b/python/ql/src/Functions/ConsistentReturns.ql @@ -2,8 +2,9 @@ * @name Explicit returns mixed with implicit (fall through) returns * @description Mixing implicit and explicit returns indicates a likely error as implicit returns always return 'None'. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * @problem.severity recommendation * @sub-severity high * @precision high diff --git a/python/ql/src/Functions/ExplicitReturnInInit.ql b/python/ql/src/Functions/ExplicitReturnInInit.ql index 000c671396e1..c4deea6111c6 100644 --- a/python/ql/src/Functions/ExplicitReturnInInit.ql +++ b/python/ql/src/Functions/ExplicitReturnInInit.ql @@ -2,7 +2,8 @@ * @name `__init__` method returns a value * @description Explicitly returning a value from an `__init__` method will raise a TypeError. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql b/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql index a99a66bca3bd..4bf52af9061f 100644 --- a/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql +++ b/python/ql/src/Functions/IncorrectRaiseInSpecialMethod.ql @@ -2,9 +2,9 @@ * @name Non-standard exception raised in special method * @description Raising a non-standard exception in a special method alters the expected interface of that method. * @kind problem - * @tags reliability - * maintainability - * convention + * @tags quality + * reliability + * error-handling * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql b/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql index e607245f97fc..a46a2370c0ee 100644 --- a/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql +++ b/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql @@ -2,7 +2,9 @@ * @name Mismatch between signature and use of an overriding method * @description Method has a different signature from the overridden method and, if it were called, would be likely to cause an error. * @kind problem - * @tags maintainability + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql b/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql index 0d68d0b506e3..6b31795d94ea 100644 --- a/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql +++ b/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql @@ -3,7 +3,9 @@ * @description Method has a signature that differs from both the signature of its overriding methods and * the arguments with which it is called, and if it were called, would be likely to cause an error. * @kind problem - * @tags maintainability + * @tags quality + * reliability + * correctness * @problem.severity recommendation * @sub-severity high * @precision high diff --git a/python/ql/src/Functions/InitIsGenerator.ql b/python/ql/src/Functions/InitIsGenerator.ql index 84bb935ad2e8..a0bb94153313 100644 --- a/python/ql/src/Functions/InitIsGenerator.ql +++ b/python/ql/src/Functions/InitIsGenerator.ql @@ -2,7 +2,8 @@ * @name `__init__` method is a generator * @description `__init__` method is a generator. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Functions/IterReturnsNonIterator.ql b/python/ql/src/Functions/IterReturnsNonIterator.ql index ed4a240ec4d1..367332cf49a7 100644 --- a/python/ql/src/Functions/IterReturnsNonIterator.ql +++ b/python/ql/src/Functions/IterReturnsNonIterator.ql @@ -2,7 +2,8 @@ * @name `__iter__` method returns a non-iterator * @description The `__iter__` method returns a non-iterator which, if used in a 'for' loop, would raise a 'TypeError'. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Functions/ModificationOfParameterWithDefault.ql b/python/ql/src/Functions/ModificationOfParameterWithDefault.ql index 3c6010916949..f0f80ef59467 100644 --- a/python/ql/src/Functions/ModificationOfParameterWithDefault.ql +++ b/python/ql/src/Functions/ModificationOfParameterWithDefault.ql @@ -3,8 +3,9 @@ * @description Modifying the default value of a parameter can lead to unexpected * results. * @kind path-problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Functions/OverlyComplexDelMethod.ql b/python/ql/src/Functions/OverlyComplexDelMethod.ql index 192623329903..b93dc4af3c34 100644 --- a/python/ql/src/Functions/OverlyComplexDelMethod.ql +++ b/python/ql/src/Functions/OverlyComplexDelMethod.ql @@ -2,11 +2,9 @@ * @name Overly complex `__del__` method * @description `__del__` methods may be called at arbitrary times, perhaps never called at all, and should be simple. * @kind problem - * @tags efficiency + * @tags quality * maintainability * complexity - * statistical - * non-attributable * @problem.severity recommendation * @sub-severity low * @precision high diff --git a/python/ql/src/Functions/ReturnConsistentTupleSizes.ql b/python/ql/src/Functions/ReturnConsistentTupleSizes.ql index f0cb83067e0f..d37ca3eda356 100644 --- a/python/ql/src/Functions/ReturnConsistentTupleSizes.ql +++ b/python/ql/src/Functions/ReturnConsistentTupleSizes.ql @@ -2,9 +2,9 @@ * @name Returning tuples with varying lengths * @description A function that potentially returns tuples of different lengths may indicate a problem. * @kind problem - * @tags reliability - * maintainability - * quality + * @tags quality + * reliability + * correctness * @problem.severity recommendation * @sub-severity high * @precision high diff --git a/python/ql/src/Functions/SignatureOverriddenMethod.ql b/python/ql/src/Functions/SignatureOverriddenMethod.ql index 85f1f0c2eb10..3e3877bc1393 100644 --- a/python/ql/src/Functions/SignatureOverriddenMethod.ql +++ b/python/ql/src/Functions/SignatureOverriddenMethod.ql @@ -4,7 +4,8 @@ * number and type of parameters has the potential to cause an error when there is a mismatch. * @kind problem * @problem.severity warning - * @tags reliability + * @tags quality + * reliability * correctness * @sub-severity high * @precision very-high diff --git a/python/ql/src/Functions/UseImplicitNoneReturnValue.ql b/python/ql/src/Functions/UseImplicitNoneReturnValue.ql index f45c9c42e0eb..aeac382f6380 100644 --- a/python/ql/src/Functions/UseImplicitNoneReturnValue.ql +++ b/python/ql/src/Functions/UseImplicitNoneReturnValue.ql @@ -2,7 +2,9 @@ * @name Use of the return value of a procedure * @description The return value of a procedure (a function that does not return a value) is used. This is confusing to the reader as the value (None) has no meaning. * @kind problem - * @tags maintainability + * @tags quality + * maintainability + * readability * @problem.severity warning * @sub-severity low * @precision high diff --git a/python/ql/src/Imports/EncodingError.ql b/python/ql/src/Imports/EncodingError.ql index 962ae4426df1..6d60342e6735 100644 --- a/python/ql/src/Imports/EncodingError.ql +++ b/python/ql/src/Imports/EncodingError.ql @@ -2,7 +2,8 @@ * @name Encoding error * @description Encoding errors cause failures at runtime and prevent analysis of the code. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Imports/ImportandImportFrom.ql b/python/ql/src/Imports/ImportandImportFrom.ql index f77ce345113d..48ada91b11b4 100644 --- a/python/ql/src/Imports/ImportandImportFrom.ql +++ b/python/ql/src/Imports/ImportandImportFrom.ql @@ -2,7 +2,9 @@ * @name Module is imported with 'import' and 'import from' * @description A module is imported with the "import" and "import from" statements * @kind problem - * @tags maintainability + * @tags quality + * maintainability + * readability * @problem.severity recommendation * @sub-severity low * @precision very-high diff --git a/python/ql/src/Imports/ModuleImportsItself.ql b/python/ql/src/Imports/ModuleImportsItself.ql index c876853fff53..72d223da3dbb 100644 --- a/python/ql/src/Imports/ModuleImportsItself.ql +++ b/python/ql/src/Imports/ModuleImportsItself.ql @@ -2,7 +2,8 @@ * @name Module imports itself * @description A module imports itself * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Imports/MultipleImports.ql b/python/ql/src/Imports/MultipleImports.ql index fdff082e0c56..f23ae25e6747 100644 --- a/python/ql/src/Imports/MultipleImports.ql +++ b/python/ql/src/Imports/MultipleImports.ql @@ -2,7 +2,8 @@ * @name Module is imported more than once * @description Importing a module a second time has no effect and impairs readability * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Imports/SyntaxError.ql b/python/ql/src/Imports/SyntaxError.ql index fd92211d2411..4a5c71b6901f 100644 --- a/python/ql/src/Imports/SyntaxError.ql +++ b/python/ql/src/Imports/SyntaxError.ql @@ -2,7 +2,8 @@ * @name Syntax error * @description Syntax errors cause failures at runtime and prevent analysis of the code. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity high diff --git a/python/ql/src/Imports/UnintentionalImport.ql b/python/ql/src/Imports/UnintentionalImport.ql index cdbcec278dd7..1faf3bb55f3d 100644 --- a/python/ql/src/Imports/UnintentionalImport.ql +++ b/python/ql/src/Imports/UnintentionalImport.ql @@ -3,8 +3,9 @@ * @description Importing a module using 'import *' may unintentionally pollute the global * namespace if the module does not define `__all__` * @kind problem - * @tags maintainability - * modularity + * @tags quality + * maintainability + * readability * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Imports/UnusedImport.ql b/python/ql/src/Imports/UnusedImport.ql index a4990a3a34c6..020356901652 100644 --- a/python/ql/src/Imports/UnusedImport.ql +++ b/python/ql/src/Imports/UnusedImport.ql @@ -2,7 +2,8 @@ * @name Unused import * @description Import is not required as it is not used * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity recommendation * @sub-severity high diff --git a/python/ql/src/Lexical/CommentedOutCode.ql b/python/ql/src/Lexical/CommentedOutCode.ql index d604e0290bff..d20ac7982700 100644 --- a/python/ql/src/Lexical/CommentedOutCode.ql +++ b/python/ql/src/Lexical/CommentedOutCode.ql @@ -2,9 +2,9 @@ * @name Commented-out code * @description Commented-out code makes the remaining code more difficult to read. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * readability - * documentation * @problem.severity recommendation * @sub-severity high * @precision high diff --git a/python/ql/src/Resources/FileNotAlwaysClosed.ql b/python/ql/src/Resources/FileNotAlwaysClosed.ql index c3950eda805d..f639bc4aa912 100644 --- a/python/ql/src/Resources/FileNotAlwaysClosed.ql +++ b/python/ql/src/Resources/FileNotAlwaysClosed.ql @@ -2,10 +2,10 @@ * @name File is not always closed * @description Opening a file without ensuring that it is always closed may lead to data loss or resource leaks. * @kind problem - * @tags efficiency + * @tags quality + * reliability * correctness - * resources - * quality + * performance * external/cwe/cwe-772 * @problem.severity warning * @sub-severity high diff --git a/python/ql/src/Statements/AssertOnTuple.ql b/python/ql/src/Statements/AssertOnTuple.ql index e86e05483c31..1dbdc5a0e175 100644 --- a/python/ql/src/Statements/AssertOnTuple.ql +++ b/python/ql/src/Statements/AssertOnTuple.ql @@ -2,8 +2,9 @@ * @name Asserting a tuple * @description Using an assert statement to test a tuple provides no validity checking. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * external/cwe/cwe-670 * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Statements/ConstantInConditional.ql b/python/ql/src/Statements/ConstantInConditional.ql index 0b12d6efd985..9aa180c19371 100644 --- a/python/ql/src/Statements/ConstantInConditional.ql +++ b/python/ql/src/Statements/ConstantInConditional.ql @@ -2,7 +2,8 @@ * @name Constant in conditional expression or statement * @description The conditional is always true or always false * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-561 * external/cwe/cwe-570 diff --git a/python/ql/src/Statements/IterableStringOrSequence.ql b/python/ql/src/Statements/IterableStringOrSequence.ql index a92a1d79d5f6..5cf92754f622 100644 --- a/python/ql/src/Statements/IterableStringOrSequence.ql +++ b/python/ql/src/Statements/IterableStringOrSequence.ql @@ -2,9 +2,9 @@ * @name Iterable can be either a string or a sequence * @description Iteration over either a string or a sequence in the same loop can cause errors that are hard to find. * @kind problem - * @tags reliability - * maintainability - * non-local + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Statements/MismatchInMultipleAssignment.ql b/python/ql/src/Statements/MismatchInMultipleAssignment.ql index 41db397bc733..188bdd7b9156 100644 --- a/python/ql/src/Statements/MismatchInMultipleAssignment.ql +++ b/python/ql/src/Statements/MismatchInMultipleAssignment.ql @@ -3,9 +3,9 @@ * @description Assigning multiple variables without ensuring that you define a * value for each variable causes an exception at runtime. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness - * types * @problem.severity error * @sub-severity low * @precision very-high diff --git a/python/ql/src/Statements/ModificationOfLocals.ql b/python/ql/src/Statements/ModificationOfLocals.ql index f766000ec3e4..05c2095f88cb 100644 --- a/python/ql/src/Statements/ModificationOfLocals.ql +++ b/python/ql/src/Statements/ModificationOfLocals.ql @@ -2,7 +2,8 @@ * @name Modification of dictionary returned by locals() * @description Modifications of the dictionary returned by locals() are not propagated to the local variables of a function. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Statements/NestedLoopsSameVariable.ql b/python/ql/src/Statements/NestedLoopsSameVariable.ql index f57fa9b361ad..48d9c7beb78c 100644 --- a/python/ql/src/Statements/NestedLoopsSameVariable.ql +++ b/python/ql/src/Statements/NestedLoopsSameVariable.ql @@ -3,8 +3,9 @@ * @description Nested loops in which the target variable is the same for each loop make * the behavior of the loops difficult to understand. * @kind problem - * @tags maintainability - * correctness + * @tags quality + * maintainability + * readability * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql b/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql index de293a7aeeae..c4deb4e64277 100644 --- a/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql +++ b/python/ql/src/Statements/NestedLoopsSameVariableWithReuse.ql @@ -3,7 +3,8 @@ * @description Redefining a variable in an inner loop and then using * the variable in an outer loop causes unexpected behavior. * @kind problem - * @tags maintainability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Statements/NonIteratorInForLoop.ql b/python/ql/src/Statements/NonIteratorInForLoop.ql index 91ad69f8d445..92527a10e3bb 100644 --- a/python/ql/src/Statements/NonIteratorInForLoop.ql +++ b/python/ql/src/Statements/NonIteratorInForLoop.ql @@ -2,9 +2,9 @@ * @name Non-iterable used in for loop * @description Using a non-iterable as the object in a 'for' loop causes a TypeError. * @kind problem - * @tags reliability + * @tags quality + * reliability * correctness - * types * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Statements/RedundantAssignment.ql b/python/ql/src/Statements/RedundantAssignment.ql index 097e4d0052f6..42561905bacd 100644 --- a/python/ql/src/Statements/RedundantAssignment.ql +++ b/python/ql/src/Statements/RedundantAssignment.ql @@ -2,8 +2,9 @@ * @name Redundant assignment * @description Assigning a variable to itself is useless and very likely indicates an error in the code. * @kind problem - * @tags reliability - * useless-code + * @tags quality + * reliability + * correctness * external/cwe/cwe-563 * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Statements/ShouldUseWithStatement.ql b/python/ql/src/Statements/ShouldUseWithStatement.ql index b453f971e86f..2ad76b5c832d 100644 --- a/python/ql/src/Statements/ShouldUseWithStatement.ql +++ b/python/ql/src/Statements/ShouldUseWithStatement.ql @@ -3,9 +3,9 @@ * @description Using a 'try-finally' block to ensure only that a resource is closed makes code more * difficult to read. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * readability - * convention * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Statements/SideEffectInAssert.ql b/python/ql/src/Statements/SideEffectInAssert.ql index e4797d2dad4b..92cb95d702bf 100644 --- a/python/ql/src/Statements/SideEffectInAssert.ql +++ b/python/ql/src/Statements/SideEffectInAssert.ql @@ -3,8 +3,9 @@ * @description Side-effects in assert statements result in differences between normal * and optimized behavior. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Statements/StatementNoEffect.ql b/python/ql/src/Statements/StatementNoEffect.ql index 72a9c91f8aeb..a5806e7082dd 100644 --- a/python/ql/src/Statements/StatementNoEffect.ql +++ b/python/ql/src/Statements/StatementNoEffect.ql @@ -2,7 +2,8 @@ * @name Statement has no effect * @description A statement has no effect * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-561 * @problem.severity recommendation diff --git a/python/ql/src/Statements/TopLevelPrint.ql b/python/ql/src/Statements/TopLevelPrint.ql index 068bd594f745..2d481421b7e8 100644 --- a/python/ql/src/Statements/TopLevelPrint.ql +++ b/python/ql/src/Statements/TopLevelPrint.ql @@ -2,9 +2,9 @@ * @name Use of a print statement at module level * @description Using a print statement at module scope (except when guarded by `if __name__ == '__main__'`) will cause surprising output when the module is imported. * @kind problem - * @tags reliability - * maintainability - * convention + * @tags quality + * reliability + * correctness * @problem.severity recommendation * @sub-severity high * @precision high diff --git a/python/ql/src/Statements/UnnecessaryElseClause.ql b/python/ql/src/Statements/UnnecessaryElseClause.ql index 35ac254b276d..5e4763637a9f 100644 --- a/python/ql/src/Statements/UnnecessaryElseClause.ql +++ b/python/ql/src/Statements/UnnecessaryElseClause.ql @@ -2,7 +2,8 @@ * @name Unnecessary 'else' clause in loop * @description An 'else' clause in a 'for' or 'while' statement that does not contain a 'break' is redundant. * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Statements/UnnecessaryPass.ql b/python/ql/src/Statements/UnnecessaryPass.ql index 215fac5192e5..1a842639b760 100644 --- a/python/ql/src/Statements/UnnecessaryPass.ql +++ b/python/ql/src/Statements/UnnecessaryPass.ql @@ -2,7 +2,8 @@ * @name Unnecessary pass * @description Unnecessary 'pass' statement * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Statements/UnreachableCode.ql b/python/ql/src/Statements/UnreachableCode.ql index 47426af2c349..98c99ac12185 100644 --- a/python/ql/src/Statements/UnreachableCode.ql +++ b/python/ql/src/Statements/UnreachableCode.ql @@ -2,7 +2,8 @@ * @name Unreachable code * @description Code is unreachable * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-561 * @problem.severity warning diff --git a/python/ql/src/Statements/UnusedExceptionObject.ql b/python/ql/src/Statements/UnusedExceptionObject.ql index 2cb4c4e447a4..90724b9f1671 100644 --- a/python/ql/src/Statements/UnusedExceptionObject.ql +++ b/python/ql/src/Statements/UnusedExceptionObject.ql @@ -2,8 +2,9 @@ * @name Unused exception object * @description An exception object is created, but is not used. * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * error-handling * @problem.severity error * @sub-severity low * @precision very-high diff --git a/python/ql/src/Statements/UseOfExit.ql b/python/ql/src/Statements/UseOfExit.ql index 4a2730b7753f..be3579481fcb 100644 --- a/python/ql/src/Statements/UseOfExit.ql +++ b/python/ql/src/Statements/UseOfExit.ql @@ -2,7 +2,9 @@ * @name Use of exit() or quit() * @description exit() or quit() may fail if the interpreter is run with the -S option. * @kind problem - * @tags maintainability + * @tags quality + * reliability + * correctness * @problem.severity warning * @sub-severity low * @precision very-high diff --git a/python/ql/src/Testing/ImpreciseAssert.ql b/python/ql/src/Testing/ImpreciseAssert.ql index 121ec6024e8a..40ceba269834 100644 --- a/python/ql/src/Testing/ImpreciseAssert.ql +++ b/python/ql/src/Testing/ImpreciseAssert.ql @@ -2,8 +2,9 @@ * @name Imprecise assert * @description Using 'assertTrue' or 'assertFalse' rather than a more specific assertion can give uninformative failure messages. * @kind problem - * @tags maintainability - * testability + * @tags quality + * maintainability + * readability * @problem.severity recommendation * @sub-severity high * @precision very-high diff --git a/python/ql/src/Variables/GlobalAtModuleLevel.ql b/python/ql/src/Variables/GlobalAtModuleLevel.ql index e0ac59d2e721..e68caf2adf48 100644 --- a/python/ql/src/Variables/GlobalAtModuleLevel.ql +++ b/python/ql/src/Variables/GlobalAtModuleLevel.ql @@ -2,7 +2,8 @@ * @name Use of 'global' at module level * @description Use of the 'global' statement at module level * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * @problem.severity warning * @sub-severity low diff --git a/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql b/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql index 034ac05ee946..38e686f94653 100644 --- a/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql +++ b/python/ql/src/Variables/LoopVariableCapture/LoopVariableCapture.ql @@ -2,8 +2,9 @@ * @name Loop variable capture * @description Capturing a loop variable is not the same as capturing its value, and can lead to unexpected behavior or bugs. * @kind path-problem - * @tags correctness - * quality + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Variables/MultiplyDefined.ql b/python/ql/src/Variables/MultiplyDefined.ql index 7d0e76fb6c30..3c26ff0b1eb1 100644 --- a/python/ql/src/Variables/MultiplyDefined.ql +++ b/python/ql/src/Variables/MultiplyDefined.ql @@ -2,7 +2,8 @@ * @name Variable defined multiple times * @description Assignment to a variable occurs multiple times without any intermediate use of that variable * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-563 * @problem.severity warning diff --git a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql index 169b686a22a1..fbeb9b2b4f96 100644 --- a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql +++ b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql @@ -2,7 +2,8 @@ * @name Suspicious unused loop iteration variable * @description A loop iteration variable is unused, which suggests an error. * @kind problem - * @tags maintainability + * @tags quality + * reliability * correctness * @problem.severity error * @sub-severity low diff --git a/python/ql/src/Variables/UndefinedExport.ql b/python/ql/src/Variables/UndefinedExport.ql index 537828616e57..173139e224a8 100644 --- a/python/ql/src/Variables/UndefinedExport.ql +++ b/python/ql/src/Variables/UndefinedExport.ql @@ -3,8 +3,9 @@ * @description Including an undefined attribute in `__all__` causes an exception when * the module is imported using '*' * @kind problem - * @tags reliability - * maintainability + * @tags quality + * reliability + * correctness * @problem.severity error * @sub-severity low * @precision high diff --git a/python/ql/src/Variables/UnusedLocalVariable.ql b/python/ql/src/Variables/UnusedLocalVariable.ql index a009d4a51b95..4acd7a08b54c 100644 --- a/python/ql/src/Variables/UnusedLocalVariable.ql +++ b/python/ql/src/Variables/UnusedLocalVariable.ql @@ -2,7 +2,8 @@ * @name Unused local variable * @description Local variable is defined but not used * @kind problem - * @tags maintainability + * @tags quality + * maintainability * useless-code * external/cwe/cwe-563 * @problem.severity recommendation diff --git a/python/ql/src/Variables/UnusedModuleVariable.ql b/python/ql/src/Variables/UnusedModuleVariable.ql index c9009d9bf369..855ca27a7417 100644 --- a/python/ql/src/Variables/UnusedModuleVariable.ql +++ b/python/ql/src/Variables/UnusedModuleVariable.ql @@ -2,7 +2,8 @@ * @name Unused global variable * @description Global variable is defined but not used * @kind problem - * @tags efficiency + * @tags quality + * maintainability * useless-code * external/cwe/cwe-563 * @problem.severity recommendation diff --git a/python/ql/src/change-notes/2025-06-18-quality-query-metadata.md b/python/ql/src/change-notes/2025-06-18-quality-query-metadata.md new file mode 100644 index 000000000000..92533f7df750 --- /dev/null +++ b/python/ql/src/change-notes/2025-06-18-quality-query-metadata.md @@ -0,0 +1,5 @@ + +--- +category: queryMetadata +--- +* The tag `quality` has been added to multiple Python quality queries for consistency. They have all been given a tag for one of the two top-level categories `reliability` or `maintainability`, and a tag for a sub-category. See [Query file metadata and alert message style guide](https://github.com/github/codeql/blob/main/docs/query-metadata-style-guide.md#quality-query-sub-category-tags) for more information about these categories. \ No newline at end of file