@specs-feup/clava-misra 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +8 -0
- package/README.md +53 -19
- package/dist/MISRA.d.ts +28 -10
- package/dist/MISRA.d.ts.map +1 -1
- package/dist/MISRA.js +30 -10
- package/dist/MISRA.js.map +1 -1
- package/dist/MISRAContext.d.ts +65 -11
- package/dist/MISRAContext.d.ts.map +1 -1
- package/dist/MISRAContext.js +131 -35
- package/dist/MISRAContext.js.map +1 -1
- package/dist/MISRARule.d.ts +38 -25
- package/dist/MISRARule.d.ts.map +1 -1
- package/dist/MISRARule.js +40 -18
- package/dist/MISRARule.js.map +1 -1
- package/dist/MISRATool.d.ts +39 -5
- package/dist/MISRATool.d.ts.map +1 -1
- package/dist/MISRATool.js +102 -46
- package/dist/MISRATool.js.map +1 -1
- package/dist/StandardGuideline.d.ts +22 -0
- package/dist/StandardGuideline.d.ts.map +1 -0
- package/dist/StandardGuideline.js +12 -0
- package/dist/StandardGuideline.js.map +1 -0
- package/dist/ast-visitor/Context.d.ts +11 -0
- package/dist/ast-visitor/Context.d.ts.map +1 -0
- package/dist/ast-visitor/Context.js +15 -0
- package/dist/ast-visitor/Context.js.map +1 -0
- package/dist/ast-visitor/Visit.d.ts +23 -0
- package/dist/ast-visitor/Visit.d.ts.map +1 -0
- package/dist/ast-visitor/Visit.js +18 -0
- package/dist/ast-visitor/Visit.js.map +1 -0
- package/dist/ast-visitor/VisitWithContext.d.ts +32 -0
- package/dist/ast-visitor/VisitWithContext.d.ts.map +1 -0
- package/dist/ast-visitor/VisitWithContext.js +26 -0
- package/dist/ast-visitor/VisitWithContext.js.map +1 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.d.ts +27 -0
- package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.d.ts.map +1 -0
- package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.js +98 -0
- package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +45 -6
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +91 -8
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +15 -5
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +20 -6
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +11 -5
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +13 -10
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +11 -6
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +19 -11
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +15 -5
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +24 -10
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +22 -6
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -1
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +37 -10
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.d.ts +66 -0
- package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.js +209 -0
- package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +37 -12
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +112 -39
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +15 -5
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +21 -7
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +11 -6
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -1
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +17 -8
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -1
- package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.d.ts +105 -0
- package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.js +258 -0
- package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.d.ts +25 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.js +27 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.d.ts +29 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.js +31 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.d.ts +25 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.js +27 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.d.ts +25 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.js +27 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.d.ts +25 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.js +27 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.d.ts +30 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.js +32 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.js.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.d.ts +25 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.d.ts.map +1 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.js +27 -0
- package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +6 -14
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +17 -27
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +13 -7
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +31 -17
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +26 -7
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +32 -14
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +48 -6
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -1
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +84 -34
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -1
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +24 -5
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -1
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +27 -7
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -1
- package/dist/rules/Section5_Identifiers/IdentifierRenameRule.d.ts +46 -0
- package/dist/rules/Section5_Identifiers/IdentifierRenameRule.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/IdentifierRenameRule.js +40 -0
- package/dist/rules/Section5_Identifiers/IdentifierRenameRule.js.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.d.ts +25 -0
- package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.js +46 -0
- package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.js.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.d.ts +26 -0
- package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.js +54 -0
- package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.js.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.d.ts +27 -0
- package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.js +55 -0
- package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.js.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.d.ts +24 -0
- package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.js +42 -0
- package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.js.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.d.ts +24 -0
- package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.d.ts.map +1 -0
- package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.js +42 -0
- package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.js.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.d.ts +35 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.d.ts.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.js +98 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.js.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.d.ts +35 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.d.ts.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.js +76 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.js.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.d.ts +32 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.d.ts.map +1 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.js +57 -0
- package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.js.map +1 -0
- package/dist/rules/UserConfigurableRule.d.ts +55 -0
- package/dist/rules/UserConfigurableRule.d.ts.map +1 -0
- package/dist/rules/UserConfigurableRule.js +16 -0
- package/dist/rules/UserConfigurableRule.js.map +1 -0
- package/dist/rules/index.d.ts +11 -18
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +47 -7
- package/dist/rules/index.js.map +1 -1
- package/dist/tests/Section17_Functions/misra_config.json +10 -0
- package/dist/tests/Section21-StandardLibraries/misra_config.json +88 -0
- package/dist/tests/Section21-StandardLibraries/problematic_misra_config.json +19 -0
- package/dist/tests/utils.d.ts +6 -3
- package/dist/tests/utils.d.ts.map +1 -1
- package/dist/tests/utils.js +33 -7
- package/dist/tests/utils.js.map +1 -1
- package/dist/utils/CallUtils.d.ts +15 -0
- package/dist/utils/CallUtils.d.ts.map +1 -0
- package/dist/utils/CallUtils.js +34 -0
- package/dist/utils/CallUtils.js.map +1 -0
- package/dist/utils/CommentUtils.d.ts +21 -0
- package/dist/utils/CommentUtils.d.ts.map +1 -0
- package/dist/utils/CommentUtils.js +27 -0
- package/dist/utils/CommentUtils.js.map +1 -0
- package/dist/utils/FileUtils.d.ts +51 -0
- package/dist/utils/FileUtils.d.ts.map +1 -0
- package/dist/utils/FileUtils.js +121 -0
- package/dist/utils/FileUtils.js.map +1 -0
- package/dist/utils/FunctionUtils.d.ts +25 -0
- package/dist/utils/FunctionUtils.d.ts.map +1 -0
- package/dist/utils/FunctionUtils.js +65 -0
- package/dist/utils/FunctionUtils.js.map +1 -0
- package/dist/utils/IdentifierUtils.d.ts +14 -0
- package/dist/utils/IdentifierUtils.d.ts.map +1 -0
- package/dist/utils/IdentifierUtils.js +87 -0
- package/dist/utils/IdentifierUtils.js.map +1 -0
- package/dist/utils/JoinpointUtils.d.ts +19 -0
- package/dist/utils/JoinpointUtils.d.ts.map +1 -0
- package/dist/utils/JoinpointUtils.js +46 -0
- package/dist/utils/JoinpointUtils.js.map +1 -0
- package/dist/utils/ProgramUtils.d.ts +14 -0
- package/dist/utils/ProgramUtils.d.ts.map +1 -0
- package/dist/utils/ProgramUtils.js +72 -0
- package/dist/utils/ProgramUtils.js.map +1 -0
- package/dist/utils/SwitchUtils.d.ts +21 -0
- package/dist/utils/SwitchUtils.d.ts.map +1 -0
- package/dist/utils/SwitchUtils.js +47 -0
- package/dist/utils/SwitchUtils.js.map +1 -0
- package/dist/utils/TypeDeclUtils.d.ts +35 -0
- package/dist/utils/TypeDeclUtils.d.ts.map +1 -0
- package/dist/utils/TypeDeclUtils.js +78 -0
- package/dist/utils/TypeDeclUtils.js.map +1 -0
- package/dist/utils/VarUtils.d.ts +19 -0
- package/dist/utils/VarUtils.d.ts.map +1 -0
- package/dist/utils/VarUtils.js +59 -0
- package/dist/utils/VarUtils.js.map +1 -0
- package/package.json +16 -6
- package/src/MISRA.ts +33 -17
- package/src/MISRAContext.ts +128 -30
- package/src/MISRARule.ts +61 -29
- package/src/MISRATool.ts +108 -42
- package/src/StandardGuideline.ts +23 -0
- package/src/ast-visitor/Context.ts +16 -0
- package/src/ast-visitor/Visit.ts +26 -0
- package/src/ast-visitor/VisitWithContext.ts +42 -0
- package/src/main.ts +1 -1
- package/src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts +114 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +103 -13
- package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +24 -10
- package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +17 -8
- package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +20 -12
- package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +23 -12
- package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +44 -13
- package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +153 -104
- package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +114 -44
- package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +27 -10
- package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +20 -12
- package/src/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.ts +317 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.ts +30 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.ts +35 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.ts +30 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.ts +30 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.ts +29 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.ts +36 -0
- package/src/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.ts +30 -0
- package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +14 -29
- package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +33 -19
- package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +33 -20
- package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +90 -45
- package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +27 -8
- package/src/rules/Section5_Identifiers/IdentifierRenameRule.ts +63 -0
- package/src/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.ts +52 -0
- package/src/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.ts +62 -0
- package/src/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.ts +61 -0
- package/src/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.ts +47 -0
- package/src/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.ts +47 -0
- package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.ts +118 -0
- package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.ts +89 -0
- package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.ts +65 -0
- package/src/rules/UserConfigurableRule.ts +60 -0
- package/src/rules/index.ts +45 -7
- package/src/tests/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.test.ts +114 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +7 -5
- package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +40 -13
- package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +10 -12
- package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +5 -5
- package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +5 -5
- package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +5 -5
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +68 -40
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions_MissingConfig.test.ts +98 -0
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions_ProblematicConfig.test.ts +71 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +103 -49
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +7 -7
- package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -7
- package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +25 -21
- package/src/tests/Section17_Functions/misra_config.json +4 -3
- package/src/tests/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.test.ts +62 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.test.ts +67 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.test.ts +84 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory_MissingConfig.test.ts +33 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory_ProblematicConfig.test.ts +71 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.test.ts +63 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.test.ts +91 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.test.ts +65 -0
- package/src/tests/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.test.ts +89 -0
- package/src/tests/Section21-StandardLibraries/misra_config.json +88 -0
- package/src/tests/Section21-StandardLibraries/problematic_misra_config.json +19 -0
- package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +148 -113
- package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +243 -163
- package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +32 -20
- package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +36 -30
- package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -8
- package/src/tests/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.test.ts +78 -0
- package/src/tests/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.test.ts +120 -0
- package/src/tests/Section5_Identifiers/Rule_5_7_UniqueTagNames.test.ts +51 -0
- package/src/tests/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.test.ts +73 -0
- package/src/tests/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.test.ts +97 -0
- package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.test.ts +160 -0
- package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.test.ts +46 -0
- package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.test.ts +69 -0
- package/src/tests/utils.ts +32 -7
- package/src/utils/CallUtils.ts +40 -0
- package/src/utils/CommentUtils.ts +29 -0
- package/src/utils/FileUtils.ts +141 -0
- package/src/utils/FunctionUtils.ts +75 -0
- package/src/utils/IdentifierUtils.ts +94 -0
- package/src/utils/JoinpointUtils.ts +53 -0
- package/src/utils/ProgramUtils.ts +83 -0
- package/src/utils/SwitchUtils.ts +52 -0
- package/src/utils/TypeDeclUtils.ts +89 -0
- package/src/utils/VarUtils.ts +70 -0
- package/tsconfig.json +2 -1
- package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +0 -120
- package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +0 -36
- package/src/utils/utils.ts +0 -280
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
|
2
|
+
import Context from "./Context.js";
|
|
3
|
+
import Visit from "./Visit.js";
|
|
4
|
+
/**
|
|
5
|
+
* Visit with a shared context to enable communication between visits
|
|
6
|
+
*
|
|
7
|
+
* Need to implement:
|
|
8
|
+
* - apply($jp)
|
|
9
|
+
* - initialValue()
|
|
10
|
+
*/
|
|
11
|
+
export default abstract class VisitWithContext<T, C extends Context<T> = Context<T>> extends Visit {
|
|
12
|
+
protected context: C;
|
|
13
|
+
/**
|
|
14
|
+
* @param context Shared context object
|
|
15
|
+
*/
|
|
16
|
+
constructor(context: C);
|
|
17
|
+
/**
|
|
18
|
+
* @return Visit name, defaults to class name
|
|
19
|
+
*/
|
|
20
|
+
get name(): string;
|
|
21
|
+
/**
|
|
22
|
+
* @returns Initial value stored in the shared context
|
|
23
|
+
*/
|
|
24
|
+
abstract initialValue(): T;
|
|
25
|
+
/**
|
|
26
|
+
* Applies the transformation to the given node
|
|
27
|
+
* @param $jp The node to transform
|
|
28
|
+
* @returns Transformation result
|
|
29
|
+
*/
|
|
30
|
+
abstract apply($jp: LaraJoinPoint): unknown;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=VisitWithContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisitWithContext.d.ts","sourceRoot":"","sources":["../../src/ast-visitor/VisitWithContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC9F,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAErB;;OAEG;gBACS,OAAO,EAAE,CAAC;IAMtB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,QAAQ,CAAC,YAAY,IAAI,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;CAC9C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Visit from "./Visit.js";
|
|
2
|
+
/**
|
|
3
|
+
* Visit with a shared context to enable communication between visits
|
|
4
|
+
*
|
|
5
|
+
* Need to implement:
|
|
6
|
+
* - apply($jp)
|
|
7
|
+
* - initialValue()
|
|
8
|
+
*/
|
|
9
|
+
export default class VisitWithContext extends Visit {
|
|
10
|
+
context;
|
|
11
|
+
/**
|
|
12
|
+
* @param context Shared context object
|
|
13
|
+
*/
|
|
14
|
+
constructor(context) {
|
|
15
|
+
super();
|
|
16
|
+
this.context = context;
|
|
17
|
+
this.context.put(this.name, this.initialValue());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @return Visit name, defaults to class name
|
|
21
|
+
*/
|
|
22
|
+
get name() {
|
|
23
|
+
return this.constructor.name;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=VisitWithContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisitWithContext.js","sourceRoot":"","sources":["../../src/ast-visitor/VisitWithContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAgB,gBAAuD,SAAQ,KAAK;IACpF,OAAO,CAAI;IAErB;;OAEG;IACH,YAAY,OAAU;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;CAaJ"}
|
package/dist/main.js
CHANGED
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAS,CAAC,iBAAiB,EAAE,CAAC;AAE9B,sCAAsC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
|
|
4
|
+
/**
|
|
5
|
+
* MISRA-C Rule 13.6: The operand of the sizeof operator shall not contain any expression which has potential side effects
|
|
6
|
+
*/
|
|
7
|
+
export default class Rule_13_6_SafeSizeOfOperand extends MISRARule {
|
|
8
|
+
#private;
|
|
9
|
+
/**
|
|
10
|
+
* Scope of analysis
|
|
11
|
+
*/
|
|
12
|
+
analysisType: AnalysisType;
|
|
13
|
+
/**
|
|
14
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
15
|
+
*/
|
|
16
|
+
get name(): string;
|
|
17
|
+
private operandIsVariableArrayType;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @param $jp - Joinpoint to analyze
|
|
21
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
22
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
23
|
+
*/
|
|
24
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
25
|
+
apply($jp: Joinpoint): MISRATransformationReport;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=Rule_13_6_SafeSizeOfOperand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_13_6_SafeSizeOfOperand.d.ts","sourceRoot":"","sources":["../../../src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,SAAS,EAAkE,MAAM,qCAAqC,CAAC;AACxJ,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAMlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,SAAS;;IAC9D;;OAEG;IACH,YAAY,eAAwC;IAMpD;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED,OAAO,CAAC,0BAA0B;IAIlC;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IA+B1D,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CA4CnD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { BinaryOp, Call, UnaryExprOrType, UnaryOp, VariableArrayType, Varref } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
5
|
+
import { getVolatileVarRefs } from "../../utils/VarUtils.js";
|
|
6
|
+
import { isValidFile } from "../../utils/FileUtils.js";
|
|
7
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
8
|
+
/**
|
|
9
|
+
* MISRA-C Rule 13.6: The operand of the sizeof operator shall not contain any expression which has potential side effects
|
|
10
|
+
*/
|
|
11
|
+
export default class Rule_13_6_SafeSizeOfOperand extends MISRARule {
|
|
12
|
+
/**
|
|
13
|
+
* Scope of analysis
|
|
14
|
+
*/
|
|
15
|
+
analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
16
|
+
#modifyingExpressions = [];
|
|
17
|
+
#functionCalls = [];
|
|
18
|
+
#volatileRefs = [];
|
|
19
|
+
/**
|
|
20
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
21
|
+
*/
|
|
22
|
+
get name() {
|
|
23
|
+
return "13.6";
|
|
24
|
+
}
|
|
25
|
+
operandIsVariableArrayType($jp) {
|
|
26
|
+
return $jp.argType != undefined && $jp.argType instanceof VariableArrayType;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param $jp - Joinpoint to analyze
|
|
31
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
32
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
33
|
+
*/
|
|
34
|
+
match($jp, logErrors = false) {
|
|
35
|
+
if (!($jp instanceof UnaryExprOrType && $jp.kind === "sizeof")) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
this.#functionCalls = Query.searchFromInclusive($jp, Call).get();
|
|
39
|
+
this.#volatileRefs = this.operandIsVariableArrayType($jp) ? getVolatileVarRefs($jp.argType.sizeExpr) : [];
|
|
40
|
+
this.#modifyingExpressions = [
|
|
41
|
+
...Query.searchFromInclusive($jp, UnaryOp, { kind: /(post_inc)|(post_dec)|(pre_inc)|(pre_dec)/ }).get(),
|
|
42
|
+
...Query.searchFromInclusive($jp, BinaryOp, { kind: /(assign)|(add_assign)|(sub_assign)|(mul_assign)|(div_assign)|(rem_assign)|(shl_assign)|(shr_assign)|(and_assign)|(xor_assign)|(or_assign)/ }).get()
|
|
43
|
+
];
|
|
44
|
+
const isNonCompliant = this.#functionCalls.length > 0 || this.#modifyingExpressions.length > 0 || this.#volatileRefs.length > 0;
|
|
45
|
+
if (isNonCompliant && logErrors) {
|
|
46
|
+
this.#functionCalls.forEach(call => {
|
|
47
|
+
this.logMISRAError(call, `Function call '${call.name}' in sizeof is not allowed because it has no effect.`);
|
|
48
|
+
});
|
|
49
|
+
this.#modifyingExpressions.forEach(expr => {
|
|
50
|
+
this.logMISRAError(expr, `Modifying expression '${expr.code}' in sizeof is not allowed because it has no effect.`);
|
|
51
|
+
});
|
|
52
|
+
this.#volatileRefs.forEach(ref => {
|
|
53
|
+
this.logMISRAError(ref, `Access to volatile object ${ref.name} in sizeof is not allowed.`);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return isNonCompliant;
|
|
57
|
+
}
|
|
58
|
+
apply($jp) {
|
|
59
|
+
if (!this.match($jp)) {
|
|
60
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
61
|
+
}
|
|
62
|
+
if (!this.operandIsVariableArrayType($jp)) {
|
|
63
|
+
for (const callJp of this.#functionCalls) {
|
|
64
|
+
const callAncestor = callJp.getAncestor("call");
|
|
65
|
+
if (callAncestor === undefined || callAncestor.depth < $jp.depth) {
|
|
66
|
+
const functionType = callJp.functionType.returnType;
|
|
67
|
+
const fileJp = callJp.getAncestor("file");
|
|
68
|
+
const tempJp = fileJp.lastChild.insertAfter(ClavaJoinPoints.stmtLiteral(`static int _temp_misra_var = sizeof(${functionType.code});`));
|
|
69
|
+
const jpIndex = Query.searchFrom(fileJp, UnaryExprOrType).get().length;
|
|
70
|
+
let newSizeOf = isValidFile(fileJp, UnaryExprOrType, jpIndex);
|
|
71
|
+
newSizeOf = $jp.replaceWith(newSizeOf);
|
|
72
|
+
newSizeOf.setArgType(functionType);
|
|
73
|
+
tempJp.detach();
|
|
74
|
+
return new MISRATransformationReport(MISRATransformationType.Replacement, newSizeOf);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
for (const expr of this.#modifyingExpressions) {
|
|
78
|
+
let varRef = expr instanceof BinaryOp ?
|
|
79
|
+
expr.left : Query.searchFrom(expr, Varref).get()[0];
|
|
80
|
+
expr.replaceWith(varRef);
|
|
81
|
+
}
|
|
82
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.#functionCalls.forEach(call => {
|
|
86
|
+
this.logMISRAError(call, `Function call '${call.name}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
|
|
87
|
+
});
|
|
88
|
+
this.#modifyingExpressions.forEach(expr => {
|
|
89
|
+
this.logMISRAError(expr, `Modifying expression '${expr.code}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
|
|
90
|
+
});
|
|
91
|
+
this.#volatileRefs.forEach(ref => {
|
|
92
|
+
this.logMISRAError(ref, `Access to volatile object '${ref.name}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
|
|
93
|
+
});
|
|
94
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=Rule_13_6_SafeSizeOfOperand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_13_6_SafeSizeOfOperand.js","sourceRoot":"","sources":["../../../src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,54 @@
|
|
|
1
1
|
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
|
-
import
|
|
4
|
-
import { MISRATransformationReport } from "../../MISRA.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
|
|
5
4
|
/**
|
|
6
|
-
* MISRA Rule 16.2: A switch label shall only be used when the most closely-
|
|
7
|
-
compound statement is the body of a switch statement
|
|
5
|
+
* MISRA-C Rule 16.2: A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement
|
|
8
6
|
*/
|
|
9
7
|
export default class Rule_16_2_TopLevelSwitch extends MISRARule {
|
|
10
8
|
#private;
|
|
11
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Scope of analysis
|
|
11
|
+
*/
|
|
12
|
+
readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
13
|
+
/**
|
|
14
|
+
* A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
|
|
15
|
+
*/
|
|
16
|
+
readonly priority = 4;
|
|
17
|
+
/**
|
|
18
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
19
|
+
*/
|
|
20
|
+
get name(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Checks if the given joinpoint is a switch statement with any misplaced case labels.
|
|
23
|
+
* A case label is considered misplaced if it is not a direct child of the switch body.
|
|
24
|
+
*
|
|
25
|
+
* @param $jp - Joinpoint to analyze
|
|
26
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
27
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
28
|
+
*/
|
|
12
29
|
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
13
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Transforms the joinpoint if it represents a switch with any misplaced case labels.
|
|
32
|
+
* For that, each case label is moved to a new location within the switch.
|
|
33
|
+
*
|
|
34
|
+
* @param $jp - Joinpoint to transform
|
|
35
|
+
* @returns Report detailing the transformation result
|
|
36
|
+
*/
|
|
37
|
+
apply($jp: Joinpoint): MISRATransformationReport;
|
|
38
|
+
/**
|
|
39
|
+
* Relocates a inner case to a new position while preserving control flow.
|
|
40
|
+
* First, copies the instructions to be executed (direct siblings and fall-through code).
|
|
41
|
+
* Then, moves the case to the new position and finally appends the copied instructions after the case.
|
|
42
|
+
*
|
|
43
|
+
* @param caseLabel The inner case to relocate
|
|
44
|
+
*/
|
|
45
|
+
private changeCaseLocation;
|
|
46
|
+
/**
|
|
47
|
+
* Retrieves the top-level case that contains a given inner case label.
|
|
48
|
+
*
|
|
49
|
+
* @param caseLabel - The inner case joinpoint
|
|
50
|
+
* @returns The ancestor case that contains the given inner case
|
|
51
|
+
*/
|
|
52
|
+
private getCaseAncestor;
|
|
14
53
|
}
|
|
15
54
|
//# sourceMappingURL=Rule_16_2_TopLevelSwitch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_2_TopLevelSwitch.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Rule_16_2_TopLevelSwitch.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACrF,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAElG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;;IAC3D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE7D;;OAEG;IACH,QAAQ,CAAC,QAAQ,KAAK;IAItB;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;IAWhD;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;CAQ1B"}
|
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
import { Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
|
1
|
+
import { Break, Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
3
|
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
4
|
-
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
|
+
import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
5
5
|
/**
|
|
6
|
-
* MISRA Rule 16.2: A switch label shall only be used when the most closely-
|
|
7
|
-
compound statement is the body of a switch statement
|
|
6
|
+
* MISRA-C Rule 16.2: A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement
|
|
8
7
|
*/
|
|
9
8
|
export default class Rule_16_2_TopLevelSwitch extends MISRARule {
|
|
9
|
+
/**
|
|
10
|
+
* Scope of analysis
|
|
11
|
+
*/
|
|
12
|
+
analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
13
|
+
/**
|
|
14
|
+
* A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
|
|
15
|
+
*/
|
|
16
|
+
priority = 4;
|
|
10
17
|
#misplacedCases = [];
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
/**
|
|
19
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
20
|
+
*/
|
|
21
|
+
get name() {
|
|
22
|
+
return "16.2";
|
|
13
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks if the given joinpoint is a switch statement with any misplaced case labels.
|
|
26
|
+
* A case label is considered misplaced if it is not a direct child of the switch body.
|
|
27
|
+
*
|
|
28
|
+
* @param $jp - Joinpoint to analyze
|
|
29
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
30
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
31
|
+
*/
|
|
14
32
|
match($jp, logErrors = false) {
|
|
15
33
|
if (!($jp instanceof Switch))
|
|
16
34
|
return false;
|
|
@@ -21,13 +39,78 @@ export default class Rule_16_2_TopLevelSwitch extends MISRARule {
|
|
|
21
39
|
}
|
|
22
40
|
return this.#misplacedCases.length > 0;
|
|
23
41
|
}
|
|
24
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Transforms the joinpoint if it represents a switch with any misplaced case labels.
|
|
44
|
+
* For that, each case label is moved to a new location within the switch.
|
|
45
|
+
*
|
|
46
|
+
* @param $jp - Joinpoint to transform
|
|
47
|
+
* @returns Report detailing the transformation result
|
|
48
|
+
*/
|
|
49
|
+
apply($jp) {
|
|
25
50
|
if (!this.match($jp))
|
|
26
51
|
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
27
52
|
for (const caseLabel of this.#misplacedCases) {
|
|
28
|
-
|
|
53
|
+
this.changeCaseLocation(caseLabel);
|
|
29
54
|
}
|
|
30
55
|
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
31
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Relocates a inner case to a new position while preserving control flow.
|
|
59
|
+
* First, copies the instructions to be executed (direct siblings and fall-through code).
|
|
60
|
+
* Then, moves the case to the new position and finally appends the copied instructions after the case.
|
|
61
|
+
*
|
|
62
|
+
* @param caseLabel The inner case to relocate
|
|
63
|
+
*/
|
|
64
|
+
changeCaseLocation(caseLabel) {
|
|
65
|
+
// Collect instructions that follow the given case
|
|
66
|
+
const instructions = caseLabel.siblingsRight.map(sibling => sibling.deepCopy());
|
|
67
|
+
// If direct instruction do not have a break statement, find additional statements from higher scopes that will be executed
|
|
68
|
+
if (!instructions.some(instruction => instruction instanceof Break)) {
|
|
69
|
+
let lastScope = caseLabel;
|
|
70
|
+
do {
|
|
71
|
+
lastScope = lastScope.parent;
|
|
72
|
+
const rightStmts = lastScope.siblingsRight;
|
|
73
|
+
for (const rightStmt of rightStmts) {
|
|
74
|
+
if (rightStmt.currentRegion instanceof Switch && rightStmt instanceof Case) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
instructions.push(rightStmt.deepCopy());
|
|
78
|
+
}
|
|
79
|
+
} while (!(lastScope.currentRegion instanceof Switch));
|
|
80
|
+
}
|
|
81
|
+
// Locate target position
|
|
82
|
+
const caseAncestor = this.getCaseAncestor(caseLabel);
|
|
83
|
+
const caseAncestorRightSiblings = caseAncestor.siblingsRight;
|
|
84
|
+
const nextCaseIndex = caseAncestorRightSiblings.findIndex(jp => jp instanceof Case);
|
|
85
|
+
const targetStmt = nextCaseIndex != -1 ? caseAncestorRightSiblings[nextCaseIndex] : caseAncestorRightSiblings[caseAncestorRightSiblings.length - 1];
|
|
86
|
+
// Move case label to the new position
|
|
87
|
+
caseLabel.detach();
|
|
88
|
+
if (targetStmt instanceof Case) {
|
|
89
|
+
targetStmt.insertBefore(caseLabel);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
targetStmt.insertAfter(caseLabel);
|
|
93
|
+
}
|
|
94
|
+
// Add instructions after caseLabel
|
|
95
|
+
let lastStmt = caseLabel;
|
|
96
|
+
for (const instruction of instructions) {
|
|
97
|
+
lastStmt.insertAfter(instruction);
|
|
98
|
+
lastStmt = instruction;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Retrieves the top-level case that contains a given inner case label.
|
|
103
|
+
*
|
|
104
|
+
* @param caseLabel - The inner case joinpoint
|
|
105
|
+
* @returns The ancestor case that contains the given inner case
|
|
106
|
+
*/
|
|
107
|
+
getCaseAncestor(caseLabel) {
|
|
108
|
+
let stmt = caseLabel;
|
|
109
|
+
while (!(stmt.currentRegion instanceof Switch)) {
|
|
110
|
+
stmt = stmt.parent;
|
|
111
|
+
}
|
|
112
|
+
const caseAncestor = stmt.siblingsLeft.reverse().find(jp => jp instanceof Case);
|
|
113
|
+
return caseAncestor;
|
|
114
|
+
}
|
|
32
115
|
}
|
|
33
116
|
//# sourceMappingURL=Rule_16_2_TopLevelSwitch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_2_TopLevelSwitch.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"Rule_16_2_TopLevelSwitch.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
|
-
import
|
|
4
|
-
import { MISRATransformationReport } from "../../MISRA.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
|
|
5
4
|
/**
|
|
6
|
-
* MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
5
|
+
* MISRA-C Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
7
6
|
*/
|
|
8
7
|
export default class Rule_16_3_UnconditionalBreak extends MISRARule {
|
|
9
8
|
#private;
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Scope of analysis
|
|
11
|
+
*/
|
|
12
|
+
readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
13
|
+
/**
|
|
14
|
+
* A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
|
|
15
|
+
*/
|
|
16
|
+
readonly priority = 3;
|
|
17
|
+
/**
|
|
18
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
19
|
+
*/
|
|
20
|
+
get name(): string;
|
|
11
21
|
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
12
22
|
private getNextStatementsToExecute;
|
|
13
23
|
private insertNextStatementsToExecute;
|
|
14
|
-
|
|
24
|
+
apply($jp: Joinpoint): MISRATransformationReport;
|
|
15
25
|
}
|
|
16
26
|
//# sourceMappingURL=Rule_16_3_UnconditionalBreak.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_3_UnconditionalBreak.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"Rule_16_3_UnconditionalBreak.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAgB,MAAM,qCAAqC,CAAC;AACrF,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;;IAC/D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE7D;;OAEG;IACH,QAAQ,CAAC,QAAQ,KAAK;IAOtB;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,6BAA6B;IAWrC,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAanD"}
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import { Break, Switch, Case } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
|
-
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
|
-
import { getLastStmtOfCase } from "../../utils/utils.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
5
4
|
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
5
|
+
import { getLastStmtOfCase } from "../../utils/SwitchUtils.js";
|
|
6
6
|
/**
|
|
7
|
-
* MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
7
|
+
* MISRA-C Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
8
8
|
*/
|
|
9
9
|
export default class Rule_16_3_UnconditionalBreak extends MISRARule {
|
|
10
|
+
/**
|
|
11
|
+
* Scope of analysis
|
|
12
|
+
*/
|
|
13
|
+
analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
14
|
+
/**
|
|
15
|
+
* A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
|
|
16
|
+
*/
|
|
17
|
+
priority = 3;
|
|
18
|
+
/**
|
|
19
|
+
* List of statements that require a `break` statement as their last sibling
|
|
20
|
+
*/
|
|
10
21
|
#statementsNeedingBreakAfter = [];
|
|
11
|
-
|
|
12
|
-
|
|
22
|
+
/**
|
|
23
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
24
|
+
*/
|
|
25
|
+
get name() {
|
|
26
|
+
return "16.3";
|
|
13
27
|
}
|
|
14
28
|
match($jp, logErrors = false) {
|
|
15
29
|
if (!($jp instanceof Switch))
|
|
@@ -43,7 +57,7 @@ export default class Rule_16_3_UnconditionalBreak extends MISRARule {
|
|
|
43
57
|
}
|
|
44
58
|
lastStmt.insertAfter(ClavaJoinPoints.breakStmt());
|
|
45
59
|
}
|
|
46
|
-
|
|
60
|
+
apply($jp) {
|
|
47
61
|
if (!this.match($jp))
|
|
48
62
|
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
49
63
|
for (const stmt of this.#statementsNeedingBreakAfter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_3_UnconditionalBreak.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"Rule_16_3_UnconditionalBreak.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
|
-
import
|
|
4
|
-
import { MISRATransformationReport } from "../../MISRA.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
|
|
5
4
|
/**
|
|
6
|
-
* MISRA Rule 16.4: Every switch statement shall have a default label
|
|
5
|
+
* MISRA-C Rule 16.4: Every switch statement shall have a default label
|
|
7
6
|
*/
|
|
8
7
|
export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Scope of analysis
|
|
10
|
+
*/
|
|
11
|
+
readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
12
|
+
/**
|
|
13
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
14
|
+
*/
|
|
15
|
+
get name(): string;
|
|
10
16
|
/**
|
|
11
17
|
* Checks if the given joinpoint is a switch statement with a default case
|
|
12
18
|
* @param $jp - Joinpoint to analyze
|
|
@@ -14,6 +20,6 @@ export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
|
14
20
|
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
15
21
|
*/
|
|
16
22
|
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
17
|
-
|
|
23
|
+
apply($jp: Joinpoint): MISRATransformationReport;
|
|
18
24
|
}
|
|
19
25
|
//# sourceMappingURL=Rule_16_4_SwitchHasDefault.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_4_SwitchHasDefault.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,
|
|
1
|
+
{"version":3,"file":"Rule_16_4_SwitchHasDefault.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAGlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE5D;;MAEE;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAU1D,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAYnD"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
2
|
import MISRARule from "../../MISRARule.js";
|
|
3
|
-
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
3
|
+
import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
4
|
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
5
|
-
import { getNumOfSwitchClauses, switchHasBooleanCondition, switchHasConditionalBreak } from "../../utils/utils.js";
|
|
6
5
|
/**
|
|
7
|
-
* MISRA Rule 16.4: Every switch statement shall have a default label
|
|
6
|
+
* MISRA-C Rule 16.4: Every switch statement shall have a default label
|
|
8
7
|
*/
|
|
9
8
|
export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Scope of analysis
|
|
11
|
+
*/
|
|
12
|
+
analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
|
|
13
|
+
/**
|
|
14
|
+
* @returns Rule identifier according to MISRA-C:2012
|
|
15
|
+
*/
|
|
16
|
+
get name() {
|
|
17
|
+
return "16.4";
|
|
12
18
|
}
|
|
13
19
|
/**
|
|
14
20
|
* Checks if the given joinpoint is a switch statement with a default case
|
|
@@ -25,17 +31,14 @@ export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
|
25
31
|
}
|
|
26
32
|
return noDefaultCase;
|
|
27
33
|
}
|
|
28
|
-
|
|
34
|
+
apply($jp) {
|
|
29
35
|
if (!this.match($jp))
|
|
30
36
|
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
31
|
-
if ((getNumOfSwitchClauses($jp) < 2 || switchHasBooleanCondition($jp)) &&
|
|
32
|
-
!switchHasConditionalBreak($jp)) { // Will be handled by rules 16.6 or 16.7
|
|
33
|
-
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
34
|
-
}
|
|
35
37
|
$jp.children[1].lastChild
|
|
36
38
|
.insertAfter(ClavaJoinPoints.defaultStmt())
|
|
37
39
|
.insertAfter(ClavaJoinPoints.emptyStmt())
|
|
38
40
|
.insertAfter(ClavaJoinPoints.breakStmt());
|
|
41
|
+
this.context.addRuleResult(this.ruleID, $jp, MISRATransformationType.DescendantChange);
|
|
39
42
|
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
40
43
|
}
|
|
41
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rule_16_4_SwitchHasDefault.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Rule_16_4_SwitchHasDefault.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D;;OAEG;IACM,YAAY,GAAG,YAAY,CAAC,uBAAuB,CAAC;IAE5D;;MAEE;IACH,IAAa,IAAI;QACb,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAc;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACpB,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;aAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;aACxC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QACvF,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
|