@specs-feup/clava-misra 1.0.0 → 1.0.1
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 +40 -8
- package/src/MISRA.ts +266 -0
- package/src/MISRAContext.ts +91 -0
- package/src/MISRARule.ts +77 -0
- package/src/MISRATool.ts +96 -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 +40 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +69 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +46 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +113 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +57 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +56 -0
- package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +78 -0
- package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
- package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +47 -0
- package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
- package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +75 -0
- package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +60 -0
- package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +46 -0
- package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +65 -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 +40 -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_4_NonVoidReturn.test.ts +85 -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 +10 -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 +39 -0
- package/src/utils/utils.ts +221 -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,120 @@
|
|
1
|
+
import { FileJp, Include, Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
5
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
6
|
+
import * as path from 'path';
|
7
|
+
|
8
|
+
/**
|
9
|
+
* MISRA Rule 20.2: The ', " or \ characters and the /* or // character sequences shall not occur in a header filename
|
10
|
+
*/
|
11
|
+
export default class Rule_20_2_InvalidHeaderFileName extends MISRARule {
|
12
|
+
constructor(context: MISRAContext) {
|
13
|
+
super("20.2", context);
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Checks if the given joinpoint is a header file whose name includes invalid characters.
|
18
|
+
*
|
19
|
+
* @param $jp - Joinpoint to analyze
|
20
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
21
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
22
|
+
*/
|
23
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
24
|
+
if (!($jp instanceof FileJp && $jp.isHeader)) return false;
|
25
|
+
|
26
|
+
const isNonCompliant = /.*('|"|\\|\/\*|\/\/).*/.test($jp.name);
|
27
|
+
if (isNonCompliant && logErrors) {
|
28
|
+
this.logMISRAError($jp, `Invalid characters in header filename. Invalid characters are ', ", \\, and the sequences /* and //.`)
|
29
|
+
}
|
30
|
+
return isNonCompliant;
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Renames a header file to ensure it contains only valid characters and updates all related includes accordingly.
|
35
|
+
*
|
36
|
+
* @param $jp - Joinpoint to transform
|
37
|
+
* @returns Report detailing the transformation result
|
38
|
+
*/
|
39
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
40
|
+
if (!this.match($jp)) {
|
41
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
42
|
+
}
|
43
|
+
|
44
|
+
const fileJp = $jp as FileJp;
|
45
|
+
const includesOfHeader = this.getMatchingIncludes(fileJp);
|
46
|
+
const newFilename = this.context.generateHeaderFilename();
|
47
|
+
|
48
|
+
fileJp.setName(newFilename);
|
49
|
+
this.updateIncludes(includesOfHeader, newFilename);
|
50
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
51
|
+
}
|
52
|
+
|
53
|
+
/**
|
54
|
+
* Finds all include joinpoints that reference a specific header file
|
55
|
+
*
|
56
|
+
* @param headerFileJp - The header file joinpoint
|
57
|
+
* @returns List of matching include statements
|
58
|
+
*/
|
59
|
+
private getMatchingIncludes(headerFileJp: FileJp): Include[] {
|
60
|
+
return Query.search(Include).get().filter(includeJp =>
|
61
|
+
path.basename(includeJp.name) === headerFileJp.name &&
|
62
|
+
this.getHeaderFilePath(includeJp) === headerFileJp.path);
|
63
|
+
}
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Computes the full path to the header file based on the include statement
|
67
|
+
*
|
68
|
+
* @param includeJp The include joinpoint
|
69
|
+
* @returns Resolved path to the header file
|
70
|
+
*/
|
71
|
+
private getHeaderFilePath(includeJp: Include): string {
|
72
|
+
try {
|
73
|
+
if (includeJp.name.startsWith("../")) {
|
74
|
+
return includeJp.relativeFolderpath;
|
75
|
+
} else {
|
76
|
+
const relativeDir = path.dirname(includeJp.name);
|
77
|
+
const fileJp = includeJp.getAncestor("file") as FileJp | undefined;
|
78
|
+
return path.resolve(fileJp!.path, relativeDir);
|
79
|
+
}
|
80
|
+
} catch (error) {
|
81
|
+
return "";
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Updates the provided include joinpoints to reference the new header file name
|
87
|
+
*
|
88
|
+
* @param includesOfHeader List of include joinpoints to update
|
89
|
+
* @param newFilename The new filename for the header file
|
90
|
+
*/
|
91
|
+
private updateIncludes(includesOfHeader: Include[], newFilename: string): void {
|
92
|
+
for (const includeJp of includesOfHeader) {
|
93
|
+
const fileJp = includeJp.getAncestor("file") as FileJp | undefined;
|
94
|
+
|
95
|
+
const newIncludeJpName = this.getNewIncludeName(includeJp, newFilename);
|
96
|
+
fileJp!.addInclude(newIncludeJpName);
|
97
|
+
|
98
|
+
const tempInclude = Query.searchFrom(fileJp!, Include, {name: includeName => path.normalize(includeName) === newIncludeJpName}).first();
|
99
|
+
|
100
|
+
if (tempInclude) {
|
101
|
+
includeJp.replaceWith(tempInclude.deepCopy());
|
102
|
+
tempInclude.detach();
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Computes the new include path with the updated header file name
|
109
|
+
*
|
110
|
+
* @param includeJp - Original include statement
|
111
|
+
* @param newHeaderFileName - New header file name
|
112
|
+
* @returns The updated include path
|
113
|
+
*/
|
114
|
+
private getNewIncludeName(includeJp: Include, newHeaderFileName: string): string {
|
115
|
+
const isFile = path.extname(includeJp.name) !== '';
|
116
|
+
const baseDir = isFile ? path.dirname(includeJp.name) : includeJp.name;
|
117
|
+
|
118
|
+
return path.join(baseDir, newHeaderFileName);
|
119
|
+
}
|
120
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { EnumDecl, Joinpoint,RecordJp,TypedefDecl, TypedefType } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
5
|
+
import { getBaseType, getTagUses, getTypeDecl, getTypedJps } from "../../utils/utils.js";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* MISRA-C Rule 2.3: A project should not contain unused type declarations.
|
9
|
+
*/
|
10
|
+
export default class Rule_2_3_UnusedTypeDecl extends MISRARule {
|
11
|
+
|
12
|
+
constructor(context: MISRAContext) {
|
13
|
+
super("2.3", context);
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Checks if a given joinpoint uses the specified typedef declaration.
|
18
|
+
* @param jp - The joinpoint to check
|
19
|
+
* @param typeDecl - The typedef declaration to check against
|
20
|
+
* @returns Returns true if the joinpoint uses the given typedef declaration, false otherwise
|
21
|
+
*/
|
22
|
+
private isTypedefUsed(jp: Joinpoint, typeDecl: TypedefDecl): boolean {
|
23
|
+
const jpType = getBaseType(jp);
|
24
|
+
return !jpType?.isBuiltin && jpType instanceof TypedefType && jpType.decl.astId === typeDecl.astId;
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Retrieves all joinpoints that use the specified typedef declaration
|
29
|
+
*
|
30
|
+
* @param typeDecl - The typedef declaration to search for in the joinpoints
|
31
|
+
* @returns Array of joinpoints that use the given typedef declaration
|
32
|
+
*/
|
33
|
+
private getTypeDefUses(typeDecl: TypedefDecl): Joinpoint[] {
|
34
|
+
return getTypedJps().filter(jp => this.isTypedefUsed(jp, typeDecl));
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Checks if the given joinpoint represents an unused type declaration
|
39
|
+
* @param $jp - Joinpoint to analyze
|
40
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
41
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
42
|
+
*/
|
43
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
44
|
+
const typeDecl = getTypeDecl($jp);
|
45
|
+
if (typeDecl === undefined) return false;
|
46
|
+
|
47
|
+
const isUnused = this.getTypeDefUses(typeDecl).length === 0;
|
48
|
+
if (logErrors && isUnused) {
|
49
|
+
this.logMISRAError($jp, `Type declaration ${typeDecl.name} is declared but not used.`)
|
50
|
+
}
|
51
|
+
return isUnused;
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Transforms the joinpoint if it represents an unused type declaration
|
56
|
+
*
|
57
|
+
* - If the joinpoint defines a tag (named struct, enum or union) that is referenced elsewhere in the code,
|
58
|
+
* the joinpoint is replaced by the tag
|
59
|
+
* - Otherwise, the joinpoint is simply removed from the AST
|
60
|
+
*
|
61
|
+
* @param $jp - Joinpoint to transform
|
62
|
+
* @returns Report detailing the transformation result
|
63
|
+
*/
|
64
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
65
|
+
if (!this.match($jp))
|
66
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
67
|
+
|
68
|
+
if (($jp instanceof RecordJp || $jp instanceof EnumDecl) && $jp.name && getTagUses($jp)) {
|
69
|
+
$jp.lastChild.detach();
|
70
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
71
|
+
}
|
72
|
+
$jp.detach();
|
73
|
+
return new MISRATransformationReport(MISRATransformationType.Removal);
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import { Joinpoint, RecordJp, EnumDecl, TagType, ElaboratedType } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
5
|
+
import { getTagUses, hasTypeDecl } from "../../utils/utils.js";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* MISRA-C Rule 2.4: A project should not contain unused tag declarations.
|
9
|
+
*/
|
10
|
+
export default class Rule_2_4_UnusedTagDecl extends MISRARule {
|
11
|
+
|
12
|
+
constructor(context: MISRAContext) {
|
13
|
+
super("2.4", context);
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Checks if the given joinpoint is an unused tag declaration
|
18
|
+
* A tag is considered to be unused if it has no references in the code or is only used within a typedef
|
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 = false): boolean {
|
25
|
+
if (!($jp instanceof RecordJp || $jp instanceof EnumDecl)) return false;
|
26
|
+
|
27
|
+
const containsTypeDecl = hasTypeDecl($jp);
|
28
|
+
const jpName = $jp.name;
|
29
|
+
if (containsTypeDecl && jpName === undefined || jpName === null || (jpName as string).trim().length === 0) {
|
30
|
+
return false;
|
31
|
+
}
|
32
|
+
|
33
|
+
const isUnused = getTagUses($jp).length === 0;
|
34
|
+
if (isUnused && logErrors) {
|
35
|
+
this.logMISRAError($jp,
|
36
|
+
containsTypeDecl ? `The tag '${$jp.name}' is declared but only used in a typedef.` : `The tag '${$jp.name}' is declared but not used.`);
|
37
|
+
}
|
38
|
+
return isUnused;
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Transforms the joinpoint if it is an unused tag declaration
|
43
|
+
* - If the Joinpoint is a tag declared in a typedef, it removes the name.
|
44
|
+
* - Otherwise, the Joinpoint is detached.
|
45
|
+
*
|
46
|
+
* @param $jp - Joinpoint to transform
|
47
|
+
* @returns Report detailing the transformation result
|
48
|
+
*/
|
49
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
50
|
+
if (!this.match($jp))
|
51
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
52
|
+
|
53
|
+
if (hasTypeDecl($jp)) {
|
54
|
+
($jp as RecordJp | EnumDecl).setName('');
|
55
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
56
|
+
}
|
57
|
+
$jp.detach();
|
58
|
+
return new MISRATransformationReport(MISRATransformationType.Removal);
|
59
|
+
}
|
60
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import { GotoStmt, FunctionJp, Joinpoint, LabelStmt } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
5
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Rule 2.6: Unused Labels.
|
9
|
+
* Checks for labels within a function that are not used.
|
10
|
+
*/
|
11
|
+
export default class Rule_2_6_UnusedLabels extends MISRARule {
|
12
|
+
|
13
|
+
constructor(context: MISRAContext) {
|
14
|
+
super("2.6", context);
|
15
|
+
}
|
16
|
+
|
17
|
+
private getUnusedLabels(func: FunctionJp): LabelStmt[] {
|
18
|
+
return Query.searchFrom(func, LabelStmt).get().filter(label =>
|
19
|
+
Query.searchFrom(func, GotoStmt, { label: jp => jp.astId === label.decl.astId }).get().length === 0
|
20
|
+
);
|
21
|
+
}
|
22
|
+
|
23
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
24
|
+
if (!($jp instanceof FunctionJp))
|
25
|
+
return false;
|
26
|
+
|
27
|
+
const unusedLabels = this.getUnusedLabels($jp);
|
28
|
+
if (logErrors) {
|
29
|
+
unusedLabels.forEach(label =>
|
30
|
+
this.logMISRAError(label, `Label ${label.decl.name} is unused in function ${$jp.name}.`)
|
31
|
+
)
|
32
|
+
}
|
33
|
+
return unusedLabels.length > 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
37
|
+
if(!this.match($jp))
|
38
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
39
|
+
|
40
|
+
const unusedLabels = this.getUnusedLabels($jp as FunctionJp);
|
41
|
+
for (const label of unusedLabels) {
|
42
|
+
label.detach();
|
43
|
+
}
|
44
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import { FunctionJp, Joinpoint, Param, Varref, Call } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
5
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
6
|
+
import { getParamReferences } from "../../utils/utils.js";
|
7
|
+
|
8
|
+
export default class Rule_2_7_UnusedParameters extends MISRARule {
|
9
|
+
|
10
|
+
constructor(context: MISRAContext) {
|
11
|
+
super("2.7", context);
|
12
|
+
}
|
13
|
+
|
14
|
+
private getUnusedParams(func: FunctionJp): Param[] {
|
15
|
+
return func.params.filter(param => getParamReferences(param, func).length === 0);
|
16
|
+
}
|
17
|
+
|
18
|
+
private getUsedParams(func: FunctionJp): Param[] {
|
19
|
+
return func.params.filter(param => getParamReferences(param, func).length > 0);
|
20
|
+
}
|
21
|
+
|
22
|
+
private getUsedParamsPositions(func: FunctionJp): number[] {
|
23
|
+
let result = [];
|
24
|
+
for (let i = 0; i < func.params.length; i++) {
|
25
|
+
const param = func.params[i];
|
26
|
+
if (Query.searchFrom(func, Varref, { decl: jp => jp?.astId === param.astId }).get().length > 0) {
|
27
|
+
result.push(i);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
return result;
|
31
|
+
}
|
32
|
+
|
33
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
34
|
+
if (!($jp instanceof FunctionJp && $jp.isImplementation)) return false;
|
35
|
+
|
36
|
+
const unusedParams = this.getUnusedParams($jp);
|
37
|
+
if (logErrors) {
|
38
|
+
unusedParams.forEach(param =>
|
39
|
+
this.logMISRAError(param, `Parameter '${param.name}' is unused in function ${$jp.name}.`)
|
40
|
+
)
|
41
|
+
}
|
42
|
+
return unusedParams.length > 0;
|
43
|
+
}
|
44
|
+
|
45
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
46
|
+
if(!this.match($jp))
|
47
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
48
|
+
|
49
|
+
const usedParams = this.getUsedParams($jp as FunctionJp);
|
50
|
+
const usedParamsPositions = this.getUsedParamsPositions($jp as FunctionJp);
|
51
|
+
const calls = Query.search(Call, {function: jp => jp.astId === $jp.astId}).get();
|
52
|
+
|
53
|
+
($jp as FunctionJp).setParams(usedParams);
|
54
|
+
for (const funcDecl of ($jp as FunctionJp).declarationJps) {
|
55
|
+
funcDecl.setParams(usedParams);
|
56
|
+
}
|
57
|
+
|
58
|
+
for (const call of calls) {
|
59
|
+
const newArgs = usedParamsPositions.map(i => call.args[i]);
|
60
|
+
const newCall = ($jp as FunctionJp).newCall(newArgs)
|
61
|
+
call.replaceWith(newCall);
|
62
|
+
}
|
63
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
64
|
+
}
|
65
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { Comment, Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { isInlineComment, getComments } from "../../utils/utils.js";
|
5
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* MISRA Rule 3.1:
|
9
|
+
*/
|
10
|
+
export default class Rule_3_1_CommentSequences extends MISRARule {
|
11
|
+
|
12
|
+
constructor(context: MISRAContext) {
|
13
|
+
super("3.1", context);
|
14
|
+
}
|
15
|
+
|
16
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
17
|
+
const invalidComments = getComments($jp).filter(comment =>
|
18
|
+
(isInlineComment(comment) && /(\/\*)/g.test(comment.text)) ||
|
19
|
+
(!isInlineComment(comment) && /(\/\/|\/\*)/g.test(comment.text)));
|
20
|
+
|
21
|
+
if (logErrors) {
|
22
|
+
invalidComments.forEach(comment =>
|
23
|
+
this.logMISRAError(comment, `Comment ${comment.text} contains invalid character sequences.`)
|
24
|
+
)
|
25
|
+
}
|
26
|
+
return invalidComments.length > 0;
|
27
|
+
}
|
28
|
+
|
29
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
30
|
+
if (!this.match($jp))
|
31
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
32
|
+
|
33
|
+
const comments = getComments($jp);
|
34
|
+
for (const comment of comments) {
|
35
|
+
const invalidSymbols = isInlineComment(comment) ? /(\/\*)/g : /(\/\/|\/\*)/g;
|
36
|
+
const newText = comment.text.replace(invalidSymbols, '');
|
37
|
+
comment.setText(newText);
|
38
|
+
}
|
39
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);;
|
40
|
+
}
|
41
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
4
|
+
import { isInlineComment, getComments } from "../../utils/utils.js";
|
5
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
6
|
+
|
7
|
+
export default class Rule_3_2_LineSplicing extends MISRARule {
|
8
|
+
|
9
|
+
constructor(context: MISRAContext) {
|
10
|
+
super("3.2", context);
|
11
|
+
}
|
12
|
+
|
13
|
+
match($jp: Joinpoint, logErrors: boolean = false): boolean {
|
14
|
+
const invalidComments = getComments($jp).filter(comment =>
|
15
|
+
(isInlineComment(comment) && /\/\n/g.test(comment.text)));
|
16
|
+
|
17
|
+
if (logErrors) {
|
18
|
+
invalidComments.forEach(comment =>
|
19
|
+
this.logMISRAError(comment, `Comment ${comment.text} contains invalid character sequences.`)
|
20
|
+
)
|
21
|
+
}
|
22
|
+
return invalidComments.length > 0;
|
23
|
+
}
|
24
|
+
|
25
|
+
transform($jp: Joinpoint): MISRATransformationReport {
|
26
|
+
if (!this.match($jp))
|
27
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
28
|
+
|
29
|
+
const comments = getComments($jp);
|
30
|
+
for (const comment of comments) {
|
31
|
+
const newText = comment.text.replace(/\/\n/g, '');
|
32
|
+
comment.setText(newText);
|
33
|
+
}
|
34
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import MISRAContext from "../MISRAContext.js";
|
2
|
+
import Rule_16_2_TopLevelSwitch from "./Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js";
|
3
|
+
import Rule_16_3_UnconditionalBreak from "./Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js";
|
4
|
+
import Rule_16_4_SwitchHasDefault from "./Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js";
|
5
|
+
import Rule_16_5_DefaultFirstOrLast from "./Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js";
|
6
|
+
import Rule_16_6_SwitchMinTwoClauses from "./Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js";
|
7
|
+
import Rule_16_7_NonBooleanSwitchCondition from "./Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js";
|
8
|
+
import Rule_17_4_NonVoidReturn from "./Section17_Functions/Rule_17_4_NonVoidReturn.js";
|
9
|
+
import Rule_17_6_StaticArraySizeParam from "./Section17_Functions/Rule_17_6_StaticArraySizeParam.js";
|
10
|
+
import Rule_17_7_UnusedReturnValue from "./Section17_Functions/Rule_17_7_UnusedReturnValue.js";
|
11
|
+
import Rule_20_2_InvalidHeaderFileName from "./Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js";
|
12
|
+
import Rule_2_3_UnusedTypeDecl from "./Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js";
|
13
|
+
import Rule_2_4_UnusedTagDecl from "./Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js";
|
14
|
+
import Rule_2_6_UnusedLabels from "./Section2_UnusedCode/Rule_2_6_UnusedLabels.js";
|
15
|
+
import Rule_2_7_UnusedParameters from "./Section2_UnusedCode/Rule_2_7_UnusedParameters.js";
|
16
|
+
import Rule_3_1_CommentSequences from "./Section3_Comments/Rule_3_1_CommentSequences.js";
|
17
|
+
import Rule_3_2_CommentSequences from "./Section3_Comments/Rule_3_2_LineSplicing.js";
|
18
|
+
|
19
|
+
export function misraRules(context: MISRAContext) {
|
20
|
+
return [
|
21
|
+
new Rule_2_3_UnusedTypeDecl(context),
|
22
|
+
new Rule_2_4_UnusedTagDecl(context),
|
23
|
+
new Rule_2_6_UnusedLabels(context),
|
24
|
+
new Rule_2_7_UnusedParameters(context),
|
25
|
+
new Rule_3_1_CommentSequences(context),
|
26
|
+
new Rule_3_2_CommentSequences(context),
|
27
|
+
new Rule_16_2_TopLevelSwitch(context),
|
28
|
+
new Rule_16_3_UnconditionalBreak(context),
|
29
|
+
new Rule_16_4_SwitchHasDefault(context),
|
30
|
+
new Rule_16_5_DefaultFirstOrLast(context),
|
31
|
+
new Rule_16_6_SwitchMinTwoClauses(context),
|
32
|
+
new Rule_16_7_NonBooleanSwitchCondition(context),
|
33
|
+
new Rule_17_4_NonVoidReturn(context),
|
34
|
+
new Rule_17_6_StaticArraySizeParam(context),
|
35
|
+
new Rule_17_7_UnusedReturnValue(context),
|
36
|
+
new Rule_20_2_InvalidHeaderFileName(context),
|
37
|
+
];
|
38
|
+
}
|
39
|
+
|
40
|
+
export default misraRules;
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const passingCode =
|
6
|
+
`void foo1( void ) {
|
7
|
+
int x, y;
|
8
|
+
switch ( x )
|
9
|
+
{
|
10
|
+
case 1:
|
11
|
+
if ( y == 1 ) {
|
12
|
+
x = 1;
|
13
|
+
}
|
14
|
+
break;
|
15
|
+
default:
|
16
|
+
break;
|
17
|
+
}
|
18
|
+
}`;
|
19
|
+
|
20
|
+
const failingCode =
|
21
|
+
`void foo2( void ) {
|
22
|
+
int x, y;
|
23
|
+
switch ( x )
|
24
|
+
{
|
25
|
+
case 1: /* Compliant */
|
26
|
+
if ( y == 1 )
|
27
|
+
{
|
28
|
+
case 2: /* Non-compliant */
|
29
|
+
x = 1;
|
30
|
+
}
|
31
|
+
break;
|
32
|
+
default:
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
}`;
|
36
|
+
|
37
|
+
const files: TestFile[] = [
|
38
|
+
{ name: "bad.c", code: failingCode },
|
39
|
+
{ name: "good.c", code: passingCode }
|
40
|
+
];
|
41
|
+
|
42
|
+
describe("Rule 16.2", () => {
|
43
|
+
registerSourceCode(files);
|
44
|
+
|
45
|
+
it("should detect errors in bad.c", () => {
|
46
|
+
expect(countMISRAErrors()).toBe(1);
|
47
|
+
|
48
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(1);
|
49
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
|
50
|
+
});
|
51
|
+
|
52
|
+
it("should correct errors in bad.c", () => {
|
53
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
54
|
+
});
|
55
|
+
});
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const passingCode =
|
6
|
+
`void foo16_3_1( void )
|
7
|
+
{
|
8
|
+
int x, a, b;
|
9
|
+
switch ( x )
|
10
|
+
{
|
11
|
+
case 0:
|
12
|
+
break;
|
13
|
+
case 1:
|
14
|
+
case 2:
|
15
|
+
break;
|
16
|
+
case 4:
|
17
|
+
a = b;
|
18
|
+
break;
|
19
|
+
case 5:
|
20
|
+
if ( a == b )
|
21
|
+
{
|
22
|
+
++a;
|
23
|
+
break;
|
24
|
+
}
|
25
|
+
break;
|
26
|
+
default:
|
27
|
+
break;
|
28
|
+
}
|
29
|
+
}`;
|
30
|
+
|
31
|
+
const failingCode =
|
32
|
+
`void foo16_3_2( void )
|
33
|
+
{
|
34
|
+
int x = 4, a, b, c;
|
35
|
+
switch (x) {
|
36
|
+
case 1:
|
37
|
+
a = 1;
|
38
|
+
break;
|
39
|
+
case 2: // Missing break
|
40
|
+
b = 10;
|
41
|
+
case 6:
|
42
|
+
case 3:
|
43
|
+
x++;
|
44
|
+
// comment1
|
45
|
+
x--;
|
46
|
+
// comment2
|
47
|
+
default:
|
48
|
+
c = 30;
|
49
|
+
}
|
50
|
+
}`;
|
51
|
+
|
52
|
+
const files: TestFile[] = [
|
53
|
+
{ name: "bad.c", code: failingCode },
|
54
|
+
{ name: "good.c", code: passingCode }
|
55
|
+
];
|
56
|
+
|
57
|
+
describe("Rule 16.3", () => {
|
58
|
+
registerSourceCode(files);
|
59
|
+
|
60
|
+
it("should detect errors in bad.c", () => {
|
61
|
+
expect(countMISRAErrors()).toBe(3);
|
62
|
+
|
63
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(3);
|
64
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
|
65
|
+
});
|
66
|
+
|
67
|
+
it("should correct errors in bad.c", () => {
|
68
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
69
|
+
});
|
70
|
+
});
|