@specs-feup/clava-misra 1.0.0 → 1.0.2
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 +117 -0
- package/README.md +70 -15
- package/dist/MISRA.d.ts +129 -0
- package/dist/MISRA.d.ts.map +1 -0
- package/dist/MISRA.js +245 -0
- package/dist/MISRA.js.map +1 -0
- package/dist/MISRAContext.d.ts +21 -0
- package/dist/MISRAContext.d.ts.map +1 -0
- package/dist/MISRAContext.js +75 -0
- package/dist/MISRAContext.js.map +1 -0
- package/dist/MISRARule.d.ts +56 -0
- package/dist/MISRARule.d.ts.map +1 -0
- package/dist/MISRARule.js +45 -0
- package/dist/MISRARule.js.map +1 -0
- package/dist/MISRATool.d.ts +12 -0
- package/dist/MISRATool.d.ts.map +1 -0
- package/dist/MISRATool.js +84 -0
- package/dist/MISRATool.js.map +1 -0
- package/dist/foo.d.ts +2 -0
- package/dist/foo.d.ts.map +1 -0
- package/{src/foo.ts → dist/foo.js} +3 -2
- package/dist/foo.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/misra/MISRAAnalyser.d.ts +14 -0
- package/dist/misra/MISRAAnalyser.d.ts.map +1 -0
- package/{src/misra/MISRAAnalyser.ts → dist/misra/MISRAAnalyser.js} +13 -23
- package/dist/misra/MISRAAnalyser.js.map +1 -0
- package/dist/misra/MISRAPass.d.ts +27 -0
- package/dist/misra/MISRAPass.d.ts.map +1 -0
- package/dist/misra/MISRAPass.js +60 -0
- package/dist/misra/MISRAPass.js.map +1 -0
- package/dist/misra/MISRAPassResult.d.ts +13 -0
- package/dist/misra/MISRAPassResult.d.ts.map +1 -0
- package/dist/misra/MISRAPassResult.js +11 -0
- package/dist/misra/MISRAPassResult.js.map +1 -0
- package/dist/misra/MISRAReporter.d.ts +20 -0
- package/dist/misra/MISRAReporter.d.ts.map +1 -0
- package/dist/misra/MISRAReporter.js +43 -0
- package/dist/misra/MISRAReporter.js.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts +42 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.js +370 -0
- package/dist/misra/passes/S10_EssentialTypePass.js.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts +18 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.js +72 -0
- package/dist/misra/passes/S12_ExpressionPass.js.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts +18 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.js +105 -0
- package/dist/misra/passes/S13_SideEffectPass.js.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts +19 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.js +94 -0
- package/dist/misra/passes/S15_ControlFlowPass.js.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts +17 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js +152 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts +12 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.js +38 -0
- package/dist/misra/passes/S17_FunctionPass.js.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts +17 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.js +115 -0
- package/dist/misra/passes/S18_PointersArraysPass.js.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts +11 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js +20 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts +20 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.js +77 -0
- package/dist/misra/passes/S21_StandardLibPass.js.map +1 -0
- package/dist/misra/passes/S3_CommentPass.d.ts +12 -0
- package/dist/misra/passes/S3_CommentPass.d.ts.map +1 -0
- package/dist/misra/passes/S3_CommentPass.js +27 -0
- package/dist/misra/passes/S3_CommentPass.js.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts +13 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.js +60 -0
- package/dist/misra/passes/S5_IdentifierPass.js.map +1 -0
- package/dist/misra/passes/S6_TypePass.d.ts +11 -0
- package/dist/misra/passes/S6_TypePass.d.ts.map +1 -0
- package/dist/misra/passes/S6_TypePass.js +25 -0
- package/dist/misra/passes/S6_TypePass.js.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts +14 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js +71 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts +18 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.js +127 -0
- package/dist/misra/passes/S8_DeclDefPass.js.map +1 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts +33 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts.map +1 -0
- package/{src/misra/sections/Section10_EssentialTypeModel.ts → dist/misra/sections/Section10_EssentialTypeModel.js} +58 -73
- package/dist/misra/sections/Section10_EssentialTypeModel.js.map +1 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts +12 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts.map +1 -0
- package/{src/misra/sections/Section11_PointerTypeConversions.ts → dist/misra/sections/Section11_PointerTypeConversions.js} +16 -27
- package/dist/misra/sections/Section11_PointerTypeConversions.js.map +1 -0
- package/dist/misra/sections/Section12_Expressions.d.ts +15 -0
- package/dist/misra/sections/Section12_Expressions.d.ts.map +1 -0
- package/dist/misra/sections/Section12_Expressions.js +70 -0
- package/dist/misra/sections/Section12_Expressions.js.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts +14 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.js +90 -0
- package/dist/misra/sections/Section13_SideEffects.js.map +1 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts +8 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts.map +1 -0
- package/{src/misra/sections/Section14_ControlStmtExprs.ts → dist/misra/sections/Section14_ControlStmtExprs.js} +8 -10
- package/dist/misra/sections/Section14_ControlStmtExprs.js.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts +14 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.js +97 -0
- package/dist/misra/sections/Section15_ControlFlow.js.map +1 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts +13 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts.map +1 -0
- package/{src/misra/sections/Section16_SwitchStatements.ts → dist/misra/sections/Section16_SwitchStatements.js} +49 -74
- package/dist/misra/sections/Section16_SwitchStatements.js.map +1 -0
- package/dist/misra/sections/Section17_Functions.d.ts +9 -0
- package/dist/misra/sections/Section17_Functions.d.ts.map +1 -0
- package/{src/misra/sections/Section17_Functions.ts → dist/misra/sections/Section17_Functions.js} +10 -13
- package/dist/misra/sections/Section17_Functions.js.map +1 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts +13 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts.map +1 -0
- package/{src/misra/sections/Section18_PointersAndArrays.ts → dist/misra/sections/Section18_PointersAndArrays.js} +36 -40
- package/dist/misra/sections/Section18_PointersAndArrays.js.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts +8 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js +16 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js.map +1 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts +8 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts.map +1 -0
- package/{src/misra/sections/Section20_PreprocessingDirectives.ts → dist/misra/sections/Section20_PreprocessingDirectives.js} +7 -9
- package/dist/misra/sections/Section20_PreprocessingDirectives.js.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts +17 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.js +54 -0
- package/dist/misra/sections/Section21_StandardLibraries.js.map +1 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts +9 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts.map +1 -0
- package/{src/misra/sections/Section2_UnusedCode.ts → dist/misra/sections/Section2_UnusedCode.js} +11 -16
- package/dist/misra/sections/Section2_UnusedCode.js.map +1 -0
- package/dist/misra/sections/Section3_Comments.d.ts +9 -0
- package/dist/misra/sections/Section3_Comments.d.ts.map +1 -0
- package/{src/misra/sections/Section3_Comments.ts → dist/misra/sections/Section3_Comments.js} +7 -10
- package/dist/misra/sections/Section3_Comments.js.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts +12 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.js +139 -0
- package/dist/misra/sections/Section5_Identifiers.js.map +1 -0
- package/dist/misra/sections/Section6_Types.d.ts +8 -0
- package/dist/misra/sections/Section6_Types.d.ts.map +1 -0
- package/dist/misra/sections/Section6_Types.js +23 -0
- package/dist/misra/sections/Section6_Types.js.map +1 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts +11 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts.map +1 -0
- package/{src/misra/sections/Section7_LiteralsConstants.ts → dist/misra/sections/Section7_LiteralsConstants.js} +18 -25
- package/dist/misra/sections/Section7_LiteralsConstants.js.map +1 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts +15 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts.map +1 -0
- package/{src/misra/sections/Section8_DeclarationsDefinitions.ts → dist/misra/sections/Section8_DeclarationsDefinitions.js} +18 -33
- package/dist/misra/sections/Section8_DeclarationsDefinitions.js.map +1 -0
- package/dist/misra/tests/utils.d.ts +10 -0
- package/dist/misra/tests/utils.d.ts.map +1 -0
- package/dist/misra/tests/utils.js +33 -0
- package/dist/misra/tests/utils.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +15 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +33 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +16 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +60 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +19 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +42 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +43 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +103 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +31 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +71 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +27 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +58 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +28 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +44 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts +55 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js +108 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +43 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +68 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +29 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +15 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +35 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +13 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +13 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +32 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts +10 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js +26 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js.map +1 -0
- package/dist/rules/index.d.ts +20 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +38 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/tests/Section17_Functions/misra_config.json +10 -0
- package/dist/tests/utils.d.ts +10 -0
- package/dist/tests/utils.d.ts.map +1 -0
- package/dist/tests/utils.js +29 -0
- package/dist/tests/utils.js.map +1 -0
- package/dist/utils/utils.d.ts +102 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +202 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.js +6 -6
- package/package.json +44 -8
- package/src/MISRA.ts +276 -0
- package/src/MISRAContext.ts +84 -0
- package/src/MISRARule.ts +64 -0
- package/src/MISRATool.ts +95 -0
- package/src/main.ts +4 -33
- package/src/misra-old/MISRAAnalyser.ts +60 -0
- package/src/misra-old/MISRAAnalyserResult.ts +16 -0
- package/src/misra-old/sections/Section10_EssentialTypeModel.ts +377 -0
- package/src/misra-old/sections/Section11_PointerTypeConversions.ts +104 -0
- package/src/{misra → misra-old}/sections/Section12_Expressions.ts +7 -7
- package/src/{misra → misra-old}/sections/Section13_SideEffects.ts +15 -15
- package/src/misra-old/sections/Section14_ControlStmtExprs.ts +27 -0
- package/src/{misra → misra-old}/sections/Section15_ControlFlow.ts +10 -10
- package/src/misra-old/sections/Section18_PointersAndArrays.ts +108 -0
- package/src/{misra → misra-old}/sections/Section19_OverlappingStorage.ts +4 -4
- package/src/misra-old/sections/Section20_PreprocessingDirectives.ts +22 -0
- package/src/misra-old/sections/Section21_StandardLibraries.ts +99 -0
- package/src/{misra → misra-old}/sections/Section5_Identifiers.ts +16 -15
- package/src/{misra → misra-old}/sections/Section6_Types.ts +4 -4
- package/src/misra-old/sections/Section7_LiteralsConstants.ts +76 -0
- package/src/misra-old/sections/Section8_DeclarationsDefinitions.ts +133 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +70 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +113 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +61 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +57 -0
- package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +180 -0
- package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +91 -0
- package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
- package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +49 -0
- package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
- package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +78 -0
- package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +61 -0
- package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +47 -0
- package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +67 -0
- package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +41 -0
- package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +36 -0
- package/src/rules/index.ts +44 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +55 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +70 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +128 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +132 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +146 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +102 -0
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +79 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +98 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +77 -0
- package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -0
- package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +44 -0
- package/src/tests/Section17_Functions/misra_config.json +19 -0
- package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +175 -0
- package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +219 -0
- package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +49 -0
- package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +55 -0
- package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -0
- package/src/tests/utils.ts +51 -0
- package/src/utils/utils.ts +280 -0
- package/tsconfig.json +4 -3
- package/typedoc.config.js +1 -1
- package/CxxSources/lib.cpp +0 -3
- package/CxxSources/lib.h +0 -8
- package/CxxSources/main.cpp +0 -40
- package/TODO.md +0 -1
- package/consumer_order.txt +0 -2
- package/enum_integer_type.txt +0 -0
- package/is_temporary.txt +0 -0
- package/omp.txt +0 -0
- package/src/misra/passes/S16_SwitchStatementPass.ts +0 -168
- package/src/misra/passes/S3_CommentPass.ts +0 -40
- package/src/misra/sections/Section21_StandardLibraries.ts +0 -65
- package/src/misra/tests/S10_EssentialTypes.test.ts +0 -253
- package/src/misra/tests/S12_Expressions.test.ts +0 -43
- package/src/misra/tests/S13_SideEffects.test.ts +0 -77
- package/src/misra/tests/S15_ControlFlow.test.ts +0 -144
- package/src/misra/tests/S16_SwitchStatements.test.ts +0 -164
- package/src/misra/tests/S17_Functions.test.ts +0 -46
- package/src/misra/tests/S18_PointersArrays.test.ts +0 -167
- package/src/misra/tests/S19_OverlappingStorage.test.ts +0 -38
- package/src/misra/tests/S3_Comments.test.ts +0 -36
- package/src/misra/tests/S6_Types.test.ts +0 -36
- package/src/misra/tests/S7_LiteralsConstants.test.ts +0 -48
- package/src/misra/tests/utils.ts +0 -47
- package/types_with_templates.txt +0 -0
- /package/src/{misra → misra-old}/MISRAPass.ts +0 -0
- /package/src/{misra → misra-old}/MISRAPassResult.ts +0 -0
- /package/src/{misra → misra-old}/MISRAReporter.ts +0 -0
- /package/src/{misra → misra-old}/passes/S10_EssentialTypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S12_ExpressionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S13_SideEffectPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S15_ControlFlowPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S17_FunctionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S18_PointersArraysPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S19_OverlappingStoragePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S21_StandardLibPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S5_IdentifierPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S6_TypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S7_LiteralsConstantsPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S8_DeclDefPass.ts +0 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* MISRA Rule 20.2: The ', " or \ characters and the /* or // character sequences shall not occur in a header filename
|
7
|
+
*/
|
8
|
+
export default class Rule_20_2_InvalidHeaderFileName extends MISRARule {
|
9
|
+
constructor(context: MISRAContext);
|
10
|
+
/**
|
11
|
+
* Checks if the given joinpoint is a header file whose name includes invalid characters.
|
12
|
+
*
|
13
|
+
* @param $jp - Joinpoint to analyze
|
14
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
15
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
16
|
+
*/
|
17
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
18
|
+
/**
|
19
|
+
* Renames a header file to ensure it contains only valid characters and updates all related includes accordingly.
|
20
|
+
*
|
21
|
+
* @param $jp - Joinpoint to transform
|
22
|
+
* @returns Report detailing the transformation result
|
23
|
+
*/
|
24
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
25
|
+
/**
|
26
|
+
* Finds all include joinpoints that reference a specific header file
|
27
|
+
*
|
28
|
+
* @param headerFileJp - The header file joinpoint
|
29
|
+
* @returns List of matching include statements
|
30
|
+
*/
|
31
|
+
private getMatchingIncludes;
|
32
|
+
/**
|
33
|
+
* Computes the full path to the header file based on the include statement
|
34
|
+
*
|
35
|
+
* @param includeJp The include joinpoint
|
36
|
+
* @returns Resolved path to the header file
|
37
|
+
*/
|
38
|
+
private getHeaderFilePath;
|
39
|
+
/**
|
40
|
+
* Updates the provided include joinpoints to reference the new header file name
|
41
|
+
*
|
42
|
+
* @param includesOfHeader List of include joinpoints to update
|
43
|
+
* @param newFilename The new filename for the header file
|
44
|
+
*/
|
45
|
+
private updateIncludes;
|
46
|
+
/**
|
47
|
+
* Computes the new include path with the updated header file name
|
48
|
+
*
|
49
|
+
* @param includeJp - Original include statement
|
50
|
+
* @param newHeaderFileName - New header file name
|
51
|
+
* @returns The updated include path
|
52
|
+
*/
|
53
|
+
private getNewIncludeName;
|
54
|
+
}
|
55
|
+
//# sourceMappingURL=Rule_20_2_InvalidHeaderFileName.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_20_2_InvalidHeaderFileName.d.ts","sourceRoot":"","sources":["../../../src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,SAAS;gBACtD,OAAO,EAAE,YAAY;IAIjC;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAU1D;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;IAcpD;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;CAM5B"}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import { FileJp, Include } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
4
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
5
|
+
import * as path from 'path';
|
6
|
+
/**
|
7
|
+
* MISRA Rule 20.2: The ', " or \ characters and the /* or // character sequences shall not occur in a header filename
|
8
|
+
*/
|
9
|
+
export default class Rule_20_2_InvalidHeaderFileName extends MISRARule {
|
10
|
+
constructor(context) {
|
11
|
+
super("20.2", context);
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Checks if the given joinpoint is a header file whose name includes invalid characters.
|
15
|
+
*
|
16
|
+
* @param $jp - Joinpoint to analyze
|
17
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
18
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
19
|
+
*/
|
20
|
+
match($jp, logErrors = false) {
|
21
|
+
if (!($jp instanceof FileJp && $jp.isHeader))
|
22
|
+
return false;
|
23
|
+
const isNonCompliant = /.*('|"|\\|\/\*|\/\/).*/.test($jp.name);
|
24
|
+
if (isNonCompliant && logErrors) {
|
25
|
+
this.logMISRAError($jp, `Invalid characters in header filename. Invalid characters are ', ", \\, and the sequences /* and //.`);
|
26
|
+
}
|
27
|
+
return isNonCompliant;
|
28
|
+
}
|
29
|
+
/**
|
30
|
+
* Renames a header file to ensure it contains only valid characters and updates all related includes accordingly.
|
31
|
+
*
|
32
|
+
* @param $jp - Joinpoint to transform
|
33
|
+
* @returns Report detailing the transformation result
|
34
|
+
*/
|
35
|
+
transform($jp) {
|
36
|
+
if (!this.match($jp)) {
|
37
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
38
|
+
}
|
39
|
+
const fileJp = $jp;
|
40
|
+
const includesOfHeader = this.getMatchingIncludes(fileJp);
|
41
|
+
const newFilename = this.context.generateHeaderFilename();
|
42
|
+
fileJp.setName(newFilename);
|
43
|
+
this.updateIncludes(includesOfHeader, newFilename);
|
44
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
45
|
+
}
|
46
|
+
/**
|
47
|
+
* Finds all include joinpoints that reference a specific header file
|
48
|
+
*
|
49
|
+
* @param headerFileJp - The header file joinpoint
|
50
|
+
* @returns List of matching include statements
|
51
|
+
*/
|
52
|
+
getMatchingIncludes(headerFileJp) {
|
53
|
+
return Query.search(Include).get().filter(includeJp => path.basename(includeJp.name) === headerFileJp.name &&
|
54
|
+
this.getHeaderFilePath(includeJp) === headerFileJp.path);
|
55
|
+
}
|
56
|
+
/**
|
57
|
+
* Computes the full path to the header file based on the include statement
|
58
|
+
*
|
59
|
+
* @param includeJp The include joinpoint
|
60
|
+
* @returns Resolved path to the header file
|
61
|
+
*/
|
62
|
+
getHeaderFilePath(includeJp) {
|
63
|
+
try {
|
64
|
+
if (includeJp.name.startsWith("../")) {
|
65
|
+
return includeJp.relativeFolderpath;
|
66
|
+
}
|
67
|
+
else {
|
68
|
+
const relativeDir = path.dirname(includeJp.name);
|
69
|
+
const fileJp = includeJp.getAncestor("file");
|
70
|
+
return path.resolve(fileJp.path, relativeDir);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
catch (error) {
|
74
|
+
return "";
|
75
|
+
}
|
76
|
+
}
|
77
|
+
/**
|
78
|
+
* Updates the provided include joinpoints to reference the new header file name
|
79
|
+
*
|
80
|
+
* @param includesOfHeader List of include joinpoints to update
|
81
|
+
* @param newFilename The new filename for the header file
|
82
|
+
*/
|
83
|
+
updateIncludes(includesOfHeader, newFilename) {
|
84
|
+
for (const includeJp of includesOfHeader) {
|
85
|
+
const fileJp = includeJp.getAncestor("file");
|
86
|
+
const newIncludeJpName = this.getNewIncludeName(includeJp, newFilename);
|
87
|
+
fileJp.addInclude(newIncludeJpName);
|
88
|
+
const tempInclude = Query.searchFrom(fileJp, Include, { name: includeName => path.normalize(includeName) === newIncludeJpName }).first();
|
89
|
+
if (tempInclude) {
|
90
|
+
includeJp.replaceWith(tempInclude.deepCopy());
|
91
|
+
tempInclude.detach();
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Computes the new include path with the updated header file name
|
97
|
+
*
|
98
|
+
* @param includeJp - Original include statement
|
99
|
+
* @param newHeaderFileName - New header file name
|
100
|
+
* @returns The updated include path
|
101
|
+
*/
|
102
|
+
getNewIncludeName(includeJp, newHeaderFileName) {
|
103
|
+
const isFile = path.extname(includeJp.name) !== '';
|
104
|
+
const baseDir = isFile ? path.dirname(includeJp.name) : includeJp.name;
|
105
|
+
return path.join(baseDir, newHeaderFileName);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
//# sourceMappingURL=Rule_20_2_InvalidHeaderFileName.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_20_2_InvalidHeaderFileName.js","sourceRoot":"","sources":["../../../src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* MISRA-C Rule 2.3: A project should not contain unused type declarations.
|
7
|
+
*/
|
8
|
+
export default class Rule_2_3_UnusedTypeDecl extends MISRARule {
|
9
|
+
constructor(context: MISRAContext);
|
10
|
+
/**
|
11
|
+
* Checks if a given joinpoint uses the specified typedef declaration.
|
12
|
+
* @param jp - The joinpoint to check
|
13
|
+
* @param typeDecl - The typedef declaration to check against
|
14
|
+
* @returns Returns true if the joinpoint uses the given typedef declaration, false otherwise
|
15
|
+
*/
|
16
|
+
private isTypedefUsed;
|
17
|
+
/**
|
18
|
+
* Retrieves all joinpoints that use the specified typedef declaration
|
19
|
+
*
|
20
|
+
* @param typeDecl - The typedef declaration to search for in the joinpoints
|
21
|
+
* @returns Array of joinpoints that use the given typedef declaration
|
22
|
+
*/
|
23
|
+
private getTypeDefUses;
|
24
|
+
/**
|
25
|
+
* Checks if the given joinpoint represents an unused type declaration
|
26
|
+
* @param $jp - Joinpoint to analyze
|
27
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
28
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
29
|
+
*/
|
30
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
31
|
+
/**
|
32
|
+
* Transforms the joinpoint if it represents an unused type declaration
|
33
|
+
*
|
34
|
+
* - If the joinpoint defines a tag (named struct, enum or union) that is referenced elsewhere in the code,
|
35
|
+
* the joinpoint is replaced by the tag
|
36
|
+
* - Otherwise, the joinpoint is simply removed from the AST
|
37
|
+
*
|
38
|
+
* @param $jp - Joinpoint to transform
|
39
|
+
* @returns Report detailing the transformation result
|
40
|
+
*/
|
41
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
42
|
+
}
|
43
|
+
//# sourceMappingURL=Rule_2_3_UnusedTypeDecl.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_3_UnusedTypeDecl.d.ts","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAoC,MAAM,qCAAqC,CAAC;AAC5G,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAGpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,SAAS;gBAE9C,OAAO,EAAE,YAAY;IAIjC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAW1D;;;;;;;;;OASG;IACH,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAWvD"}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import { EnumDecl, RecordJp, TypedefType } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
4
|
+
import { getBaseType, getTagUses, getTypeDecl, getTypedJps } from "../../utils/utils.js";
|
5
|
+
/**
|
6
|
+
* MISRA-C Rule 2.3: A project should not contain unused type declarations.
|
7
|
+
*/
|
8
|
+
export default class Rule_2_3_UnusedTypeDecl extends MISRARule {
|
9
|
+
constructor(context) {
|
10
|
+
super("2.3", context);
|
11
|
+
}
|
12
|
+
/**
|
13
|
+
* Checks if a given joinpoint uses the specified typedef declaration.
|
14
|
+
* @param jp - The joinpoint to check
|
15
|
+
* @param typeDecl - The typedef declaration to check against
|
16
|
+
* @returns Returns true if the joinpoint uses the given typedef declaration, false otherwise
|
17
|
+
*/
|
18
|
+
isTypedefUsed(jp, typeDecl) {
|
19
|
+
const jpType = getBaseType(jp);
|
20
|
+
return !jpType?.isBuiltin && jpType instanceof TypedefType && jpType.decl.astId === typeDecl.astId;
|
21
|
+
}
|
22
|
+
/**
|
23
|
+
* Retrieves all joinpoints that use the specified typedef declaration
|
24
|
+
*
|
25
|
+
* @param typeDecl - The typedef declaration to search for in the joinpoints
|
26
|
+
* @returns Array of joinpoints that use the given typedef declaration
|
27
|
+
*/
|
28
|
+
getTypeDefUses(typeDecl) {
|
29
|
+
return getTypedJps().filter(jp => this.isTypedefUsed(jp, typeDecl));
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Checks if the given joinpoint represents an unused type declaration
|
33
|
+
* @param $jp - Joinpoint to analyze
|
34
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
35
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
36
|
+
*/
|
37
|
+
match($jp, logErrors = false) {
|
38
|
+
const typeDecl = getTypeDecl($jp);
|
39
|
+
if (typeDecl === undefined)
|
40
|
+
return false;
|
41
|
+
const isUnused = this.getTypeDefUses(typeDecl).length === 0;
|
42
|
+
if (logErrors && isUnused) {
|
43
|
+
this.logMISRAError($jp, `Type declaration ${typeDecl.name} is declared but not used.`);
|
44
|
+
}
|
45
|
+
return isUnused;
|
46
|
+
}
|
47
|
+
/**
|
48
|
+
* Transforms the joinpoint if it represents an unused type declaration
|
49
|
+
*
|
50
|
+
* - If the joinpoint defines a tag (named struct, enum or union) that is referenced elsewhere in the code,
|
51
|
+
* the joinpoint is replaced by the tag
|
52
|
+
* - Otherwise, the joinpoint is simply removed from the AST
|
53
|
+
*
|
54
|
+
* @param $jp - Joinpoint to transform
|
55
|
+
* @returns Report detailing the transformation result
|
56
|
+
*/
|
57
|
+
transform($jp) {
|
58
|
+
if (!this.match($jp))
|
59
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
60
|
+
if (($jp instanceof RecordJp || $jp instanceof EnumDecl) && $jp.name && getTagUses($jp)) {
|
61
|
+
$jp.lastChild.detach();
|
62
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
63
|
+
}
|
64
|
+
$jp.detach();
|
65
|
+
return new MISRATransformationReport(MISRATransformationType.Removal);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
//# sourceMappingURL=Rule_2_3_UnusedTypeDecl.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_3_UnusedTypeDecl.js","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,QAAQ,EAAc,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAC5G,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,SAAS;IAE1D,YAAY,OAAqB;QAC7B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,EAAa,EAAE,QAAqB;QACtD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;IACvG,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAAC,QAAqB;QACxC,OAAO,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5D,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,oBAAoB,QAAQ,CAAC,IAAI,4BAA4B,CAAC,CAAA;QAC1F,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,IAAI,CAAC,GAAG,YAAY,QAAQ,IAAI,GAAG,YAAY,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QACnF,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;CACJ"}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* MISRA-C Rule 2.4: A project should not contain unused tag declarations.
|
7
|
+
*/
|
8
|
+
export default class Rule_2_4_UnusedTagDecl extends MISRARule {
|
9
|
+
constructor(context: MISRAContext);
|
10
|
+
/**
|
11
|
+
* Checks if the given joinpoint is an unused tag declaration
|
12
|
+
* A tag is considered to be unused if it has no references in the code or is only used within a typedef
|
13
|
+
*
|
14
|
+
* @param $jp - Joinpoint to analyze
|
15
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
16
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
17
|
+
*/
|
18
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
19
|
+
/**
|
20
|
+
* Transforms the joinpoint if it is an unused tag declaration
|
21
|
+
* - If the Joinpoint is a tag declared in a typedef, it removes the name.
|
22
|
+
* - Otherwise, the Joinpoint is detached.
|
23
|
+
*
|
24
|
+
* @param $jp - Joinpoint to transform
|
25
|
+
* @returns Report detailing the transformation result
|
26
|
+
*/
|
27
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
28
|
+
}
|
29
|
+
//# sourceMappingURL=Rule_2_4_UnusedTagDecl.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_4_UnusedTagDecl.d.ts","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA+C,MAAM,qCAAqC,CAAC;AAC7G,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAGpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,SAAS;gBAE7C,OAAO,EAAE,YAAY;IAIjC;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAiB1D;;;;;;;OAOG;IACH,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAWvD"}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import { RecordJp, EnumDecl } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
4
|
+
import { getTagUses, hasTypeDecl } from "../../utils/utils.js";
|
5
|
+
/**
|
6
|
+
* MISRA-C Rule 2.4: A project should not contain unused tag declarations.
|
7
|
+
*/
|
8
|
+
export default class Rule_2_4_UnusedTagDecl extends MISRARule {
|
9
|
+
constructor(context) {
|
10
|
+
super("2.4", context);
|
11
|
+
}
|
12
|
+
/**
|
13
|
+
* Checks if the given joinpoint is an unused tag declaration
|
14
|
+
* A tag is considered to be unused if it has no references in the code or is only used within a typedef
|
15
|
+
*
|
16
|
+
* @param $jp - Joinpoint to analyze
|
17
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
18
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
19
|
+
*/
|
20
|
+
match($jp, logErrors = false) {
|
21
|
+
if (!($jp instanceof RecordJp || $jp instanceof EnumDecl))
|
22
|
+
return false;
|
23
|
+
const containsTypeDecl = hasTypeDecl($jp);
|
24
|
+
const jpName = $jp.name;
|
25
|
+
if (containsTypeDecl && jpName === undefined || jpName === null || jpName.trim().length === 0) {
|
26
|
+
return false;
|
27
|
+
}
|
28
|
+
const isUnused = getTagUses($jp).length === 0;
|
29
|
+
if (isUnused && logErrors) {
|
30
|
+
this.logMISRAError($jp, containsTypeDecl ? `The tag '${$jp.name}' is declared but only used in a typedef.` : `The tag '${$jp.name}' is declared but not used.`);
|
31
|
+
}
|
32
|
+
return isUnused;
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
* Transforms the joinpoint if it is an unused tag declaration
|
36
|
+
* - If the Joinpoint is a tag declared in a typedef, it removes the name.
|
37
|
+
* - Otherwise, the Joinpoint is detached.
|
38
|
+
*
|
39
|
+
* @param $jp - Joinpoint to transform
|
40
|
+
* @returns Report detailing the transformation result
|
41
|
+
*/
|
42
|
+
transform($jp) {
|
43
|
+
if (!this.match($jp))
|
44
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
45
|
+
if (hasTypeDecl($jp)) {
|
46
|
+
$jp.setName('');
|
47
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
48
|
+
}
|
49
|
+
$jp.detach();
|
50
|
+
return new MISRATransformationReport(MISRATransformationType.Removal);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
//# sourceMappingURL=Rule_2_4_UnusedTagDecl.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_4_UnusedTagDecl.js","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,QAAQ,EAA2B,MAAM,qCAAqC,CAAC;AAC7G,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,SAAS;IAEzD,YAAY,OAAqB;QAC7B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,QAAQ,IAAI,GAAG,YAAY,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAExE,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,gBAAgB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAK,MAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxG,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9C,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,GAAG,EAClB,gBAAgB,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,2CAA2C,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAChJ,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,GAA2B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QACnF,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;CACJ"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* Rule 2.6: Unused Labels.
|
7
|
+
* Checks for labels within a function that are not used.
|
8
|
+
*/
|
9
|
+
export default class Rule_2_6_UnusedLabels extends MISRARule {
|
10
|
+
constructor(context: MISRAContext);
|
11
|
+
private getUnusedLabels;
|
12
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
13
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=Rule_2_6_UnusedLabels.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_6_UnusedLabels.d.ts","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,SAAS,EAAa,MAAM,qCAAqC,CAAC;AACjG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;gBAE5C,OAAO,EAAE,YAAY;IAIjC,OAAO,CAAC,eAAe;IAMvB,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAa1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAUvD"}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { GotoStmt, FunctionJp, LabelStmt } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* Rule 2.6: Unused Labels.
|
7
|
+
* Checks for labels within a function that are not used.
|
8
|
+
*/
|
9
|
+
export default class Rule_2_6_UnusedLabels extends MISRARule {
|
10
|
+
constructor(context) {
|
11
|
+
super("2.6", context);
|
12
|
+
}
|
13
|
+
getUnusedLabels(func) {
|
14
|
+
return Query.searchFrom(func, LabelStmt).get().filter(label => Query.searchFrom(func, GotoStmt, { label: jp => jp.astId === label.decl.astId }).get().length === 0);
|
15
|
+
}
|
16
|
+
match($jp, logErrors = false) {
|
17
|
+
if (!($jp instanceof FunctionJp))
|
18
|
+
return false;
|
19
|
+
const unusedLabels = this.getUnusedLabels($jp);
|
20
|
+
if (logErrors) {
|
21
|
+
unusedLabels.forEach(label => this.logMISRAError(label, `Label ${label.decl.name} is unused in function ${$jp.name}.`));
|
22
|
+
}
|
23
|
+
return unusedLabels.length > 0;
|
24
|
+
}
|
25
|
+
transform($jp) {
|
26
|
+
if (!this.match($jp))
|
27
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
28
|
+
const unusedLabels = this.getUnusedLabels($jp);
|
29
|
+
for (const label of unusedLabels) {
|
30
|
+
label.detach();
|
31
|
+
}
|
32
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
//# sourceMappingURL=Rule_2_6_UnusedLabels.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_6_UnusedLabels.js","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAa,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACjG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IAExD,YAAY,OAAqB;QAC7B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAEO,eAAe,CAAC,IAAgB;QACpC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1D,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,CACtG,CAAC;IACN,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC;YAC5B,OAAO,KAAK,CAAC;QAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,0BAA0B,GAAG,CAAC,IAAI,GAAG,CAAC,CAC3F,CAAA;QACL,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACf,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAiB,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAC/B,KAAK,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
export default class Rule_2_7_UnusedParameters extends MISRARule {
|
6
|
+
constructor(context: MISRAContext);
|
7
|
+
private getUnusedParams;
|
8
|
+
private getUsedParams;
|
9
|
+
private getUsedParamsPositions;
|
10
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
11
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=Rule_2_7_UnusedParameters.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_7_UnusedParameters.d.ts","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAuB,MAAM,qCAAqC,CAAC;AACjG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAGpF,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,SAAS;gBAEhD,OAAO,EAAE,YAAY;IAIjC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAW9B,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAY1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAoBvD"}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import { FunctionJp, Varref, Call } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
5
|
+
import { getParamReferences } from "../../utils/utils.js";
|
6
|
+
export default class Rule_2_7_UnusedParameters extends MISRARule {
|
7
|
+
constructor(context) {
|
8
|
+
super("2.7", context);
|
9
|
+
}
|
10
|
+
getUnusedParams(func) {
|
11
|
+
return func.params.filter(param => getParamReferences(param, func).length === 0);
|
12
|
+
}
|
13
|
+
getUsedParams(func) {
|
14
|
+
return func.params.filter(param => getParamReferences(param, func).length > 0);
|
15
|
+
}
|
16
|
+
getUsedParamsPositions(func) {
|
17
|
+
let result = [];
|
18
|
+
for (let i = 0; i < func.params.length; i++) {
|
19
|
+
const param = func.params[i];
|
20
|
+
if (Query.searchFrom(func, Varref, { decl: jp => jp?.astId === param.astId }).get().length > 0) {
|
21
|
+
result.push(i);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
return result;
|
25
|
+
}
|
26
|
+
match($jp, logErrors = false) {
|
27
|
+
if (!($jp instanceof FunctionJp && $jp.isImplementation))
|
28
|
+
return false;
|
29
|
+
const unusedParams = this.getUnusedParams($jp);
|
30
|
+
if (logErrors) {
|
31
|
+
unusedParams.forEach(param => this.logMISRAError(param, `Parameter '${param.name}' is unused in function ${$jp.name}.`));
|
32
|
+
}
|
33
|
+
return unusedParams.length > 0;
|
34
|
+
}
|
35
|
+
transform($jp) {
|
36
|
+
if (!this.match($jp))
|
37
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
38
|
+
const usedParams = this.getUsedParams($jp);
|
39
|
+
const usedParamsPositions = this.getUsedParamsPositions($jp);
|
40
|
+
const calls = Query.search(Call, { function: jp => jp.astId === $jp.astId }).get();
|
41
|
+
$jp.setParams(usedParams);
|
42
|
+
for (const funcDecl of $jp.declarationJps) {
|
43
|
+
funcDecl.setParams(usedParams);
|
44
|
+
}
|
45
|
+
for (const call of calls) {
|
46
|
+
const newArgs = usedParamsPositions.map(i => call.args[i]);
|
47
|
+
const newCall = $jp.newCall(newArgs);
|
48
|
+
call.replaceWith(newCall);
|
49
|
+
}
|
50
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
//# sourceMappingURL=Rule_2_7_UnusedParameters.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_2_7_UnusedParameters.js","sourceRoot":"","sources":["../../../src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
/**
|
6
|
+
* MISRA Rule 3.1:
|
7
|
+
*/
|
8
|
+
export default class Rule_3_1_CommentSequences extends MISRARule {
|
9
|
+
constructor(context: MISRAContext);
|
10
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
11
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=Rule_3_1_CommentSequences.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_3_1_CommentSequences.d.ts","sourceRoot":"","sources":["../../../src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,SAAS;gBAEhD,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAa1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAYvD"}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import MISRARule from "../../MISRARule.js";
|
2
|
+
import { isInlineComment, getComments } from "../../utils/utils.js";
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
4
|
+
/**
|
5
|
+
* MISRA Rule 3.1:
|
6
|
+
*/
|
7
|
+
export default class Rule_3_1_CommentSequences extends MISRARule {
|
8
|
+
constructor(context) {
|
9
|
+
super("3.1", context);
|
10
|
+
}
|
11
|
+
match($jp, logErrors = false) {
|
12
|
+
const invalidComments = getComments($jp).filter(comment => (isInlineComment(comment) && /(\/\*)/g.test(comment.text)) ||
|
13
|
+
(!isInlineComment(comment) && /(\/\/|\/\*)/g.test(comment.text)));
|
14
|
+
if (logErrors) {
|
15
|
+
invalidComments.forEach(comment => this.logMISRAError(comment, `Comment ${comment.text} contains invalid character sequences.`));
|
16
|
+
}
|
17
|
+
return invalidComments.length > 0;
|
18
|
+
}
|
19
|
+
transform($jp) {
|
20
|
+
if (!this.match($jp))
|
21
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
22
|
+
const comments = getComments($jp);
|
23
|
+
for (const comment of comments) {
|
24
|
+
const invalidSymbols = isInlineComment(comment) ? /(\/\*)/g : /(\/\/|\/\*)/g;
|
25
|
+
const newText = comment.text.replace(invalidSymbols, '');
|
26
|
+
comment.setText(newText);
|
27
|
+
}
|
28
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
29
|
+
;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
//# sourceMappingURL=Rule_3_1_CommentSequences.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_3_1_CommentSequences.js","sourceRoot":"","sources":["../../../src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,SAAS;IAE5D,YAAY,OAAqB;QAC7B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACtD,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,SAAS,EAAE,CAAC;YACZ,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,OAAO,CAAC,IAAI,wCAAwC,CAAC,CAC/F,CAAA;QACL,CAAC;QACD,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;YAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAAA,CAAC;IACpF,CAAC;CACJ"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
5
|
+
export default class Rule_3_2_LineSplicing extends MISRARule {
|
6
|
+
constructor(context: MISRAContext);
|
7
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
8
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
9
|
+
}
|
10
|
+
//# sourceMappingURL=Rule_3_2_LineSplicing.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Rule_3_2_LineSplicing.d.ts","sourceRoot":"","sources":["../../../src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;gBAE5C,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAY1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAWvD"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import MISRARule from "../../MISRARule.js";
|
2
|
+
import { isInlineComment, getComments } from "../../utils/utils.js";
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
4
|
+
export default class Rule_3_2_LineSplicing extends MISRARule {
|
5
|
+
constructor(context) {
|
6
|
+
super("3.2", context);
|
7
|
+
}
|
8
|
+
match($jp, logErrors = false) {
|
9
|
+
const invalidComments = getComments($jp).filter(comment => (isInlineComment(comment) && /\/\n/g.test(comment.text)));
|
10
|
+
if (logErrors) {
|
11
|
+
invalidComments.forEach(comment => this.logMISRAError(comment, `Comment ${comment.text} contains invalid character sequences.`));
|
12
|
+
}
|
13
|
+
return invalidComments.length > 0;
|
14
|
+
}
|
15
|
+
transform($jp) {
|
16
|
+
if (!this.match($jp))
|
17
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
18
|
+
const comments = getComments($jp);
|
19
|
+
for (const comment of comments) {
|
20
|
+
const newText = comment.text.replace(/\/\n/g, '');
|
21
|
+
comment.setText(newText);
|
22
|
+
}
|
23
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=Rule_3_2_LineSplicing.js.map
|