@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,49 @@
|
|
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
|
+
int test1() {
|
7
|
+
int x = 0;
|
8
|
+
goto label1;
|
9
|
+
|
10
|
+
label1:
|
11
|
+
x++;
|
12
|
+
|
13
|
+
return 0;
|
14
|
+
}`;
|
15
|
+
|
16
|
+
const failingCode = `
|
17
|
+
int test2() {
|
18
|
+
int x = 0;
|
19
|
+
label1:
|
20
|
+
x = 1;
|
21
|
+
label2:
|
22
|
+
x++;
|
23
|
+
|
24
|
+
goto label3;
|
25
|
+
|
26
|
+
label3:
|
27
|
+
x += 4;
|
28
|
+
return 0;
|
29
|
+
}`;
|
30
|
+
|
31
|
+
const files: TestFile[] = [
|
32
|
+
{ name: "bad.c", code: failingCode },
|
33
|
+
{ name: "good.c", code: passingCode }
|
34
|
+
];
|
35
|
+
|
36
|
+
describe("Rule 2.6", () => {
|
37
|
+
registerSourceCode(files);
|
38
|
+
|
39
|
+
it("should detect errors in bad.c", () => {
|
40
|
+
expect(countMISRAErrors()).toBe(2);
|
41
|
+
|
42
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
|
43
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
|
44
|
+
});
|
45
|
+
|
46
|
+
it("should correct errors in bad.c", () => {
|
47
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
48
|
+
});
|
49
|
+
});
|
@@ -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 failingCode = `
|
6
|
+
int foo(int x, int y, int z);
|
7
|
+
|
8
|
+
int foo(int x, int y, int z) {
|
9
|
+
y++;
|
10
|
+
return y;
|
11
|
+
}
|
12
|
+
|
13
|
+
int main() {
|
14
|
+
int a = 5, b = 10, c = 15;
|
15
|
+
int result1 = foo(a, b, c);
|
16
|
+
|
17
|
+
int result2 = result1 + foo(a, b, c);
|
18
|
+
|
19
|
+
return result2;
|
20
|
+
}`;
|
21
|
+
|
22
|
+
const passingCode = `
|
23
|
+
extern int foo(int x, int y, int z);
|
24
|
+
|
25
|
+
int my_func(int x, int y, int z) {
|
26
|
+
return x + y + z;
|
27
|
+
}
|
28
|
+
|
29
|
+
int my_func2() {
|
30
|
+
return 0;
|
31
|
+
}
|
32
|
+
|
33
|
+
int bar() {
|
34
|
+
return my_func(1, 2, 3) + foo(50, 51, 52);
|
35
|
+
}`;
|
36
|
+
|
37
|
+
const files: TestFile[] = [
|
38
|
+
{ name: "bad.c", code: failingCode },
|
39
|
+
{ name: "good.c", code: passingCode }
|
40
|
+
];
|
41
|
+
|
42
|
+
describe("Rule 2.7", () => {
|
43
|
+
registerSourceCode(files);
|
44
|
+
|
45
|
+
it("should detect errors in bad.c", () => {
|
46
|
+
expect(countMISRAErrors()).toBe(2);
|
47
|
+
|
48
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
|
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,37 @@
|
|
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 = `int main() {
|
6
|
+
int x, y, z;// good inline comment
|
7
|
+
// good */ comment
|
8
|
+
return 0;
|
9
|
+
}`;
|
10
|
+
|
11
|
+
const failingCode = `int test() {
|
12
|
+
int x, y, z; // bad inl/*ine comment
|
13
|
+
|
14
|
+
/* bad /* block comment */
|
15
|
+
|
16
|
+
return 0;
|
17
|
+
}`;
|
18
|
+
|
19
|
+
const files: TestFile[] = [
|
20
|
+
{ name: "bad.c", code: failingCode },
|
21
|
+
{ name: "good.c", code: passingCode }
|
22
|
+
];
|
23
|
+
|
24
|
+
describe("Rule 3.1", () => {
|
25
|
+
registerSourceCode(files);
|
26
|
+
|
27
|
+
it("should detect errors in bad.c", () => {
|
28
|
+
expect(countMISRAErrors()).toBe(2);
|
29
|
+
|
30
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
|
31
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
|
32
|
+
});
|
33
|
+
|
34
|
+
it("should correct errors in bad.c", () => {
|
35
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
36
|
+
});
|
37
|
+
});
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import MISRATool from "../MISRATool.js";
|
2
|
+
import Clava from "@specs-feup/clava/api/clava/Clava.js";
|
3
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
4
|
+
import { FileJp, Program } from "@specs-feup/clava/api/Joinpoints.js";
|
5
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
6
|
+
import * as os from 'os';
|
7
|
+
|
8
|
+
export function countMISRAErrors(startingPoint: FileJp | Program = Query.root() as Program): number {
|
9
|
+
MISRATool.checkCompliance(startingPoint);
|
10
|
+
return MISRATool.getErrorCount();
|
11
|
+
}
|
12
|
+
|
13
|
+
export function countErrorsAfterCorrection(configPath?: string): number {
|
14
|
+
MISRATool.applyCorrections(configPath);
|
15
|
+
return MISRATool.getActiveErrorCount();
|
16
|
+
}
|
17
|
+
|
18
|
+
export interface TestFile {
|
19
|
+
name: string,
|
20
|
+
code: string
|
21
|
+
path?: string
|
22
|
+
}
|
23
|
+
|
24
|
+
export function registerSourceCode(files: TestFile[]): void {
|
25
|
+
beforeEach(() => {
|
26
|
+
const dataStore = Clava.getData();
|
27
|
+
|
28
|
+
dataStore.setStandard(process.env.STD_VERSION!);
|
29
|
+
|
30
|
+
// If running on macOS, change libcCxxMode
|
31
|
+
if (os.platform() === 'darwin') {
|
32
|
+
const key = "libcCxxMode";
|
33
|
+
const allowedValues = dataStore.getType(key).getEnumConstants();
|
34
|
+
const systemValue = allowedValues.find((value: any) => value.name() === "SYSTEM");
|
35
|
+
dataStore.put(key, systemValue);
|
36
|
+
}
|
37
|
+
|
38
|
+
Clava.getProgram().push();
|
39
|
+
const program = Clava.getProgram();
|
40
|
+
files.forEach(file => {
|
41
|
+
const sourceFile = ClavaJoinPoints.fileWithSource(file.name, file.code, file.path);
|
42
|
+
program.addFile(sourceFile);
|
43
|
+
});
|
44
|
+
program.rebuild();
|
45
|
+
});
|
46
|
+
|
47
|
+
afterEach(() => {
|
48
|
+
Clava.getProgram().rebuild();
|
49
|
+
Clava.getProgram().pop();
|
50
|
+
});
|
51
|
+
}
|
@@ -0,0 +1,280 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { Comment, Type, Case, Joinpoint, ArrayType, TypedefDecl, DeclStmt, TypedefNameDecl, StorageClass, FunctionJp, Vardecl, FileJp, RecordJp, EnumDecl, PointerType, Switch, BuiltinType, BinaryOp, Break, Scope, Statement, Expression, WrapperStmt, ElaboratedType, TagType, Param, Varref, Program, Include, Call } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Checks if the comment is an inline comment
|
7
|
+
* @param $comment - The comment to check
|
8
|
+
* @returns Returns true if it's an inline comment, otherwise returns false
|
9
|
+
*/
|
10
|
+
export function isInlineComment($comment: Comment): boolean {
|
11
|
+
return $comment.astName === "InlineComment";
|
12
|
+
}
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Retrieves all comments associated with a given joinpoint
|
16
|
+
* @param $jp - The joinpoint to retrieve comments from
|
17
|
+
* @returns Array of comments
|
18
|
+
*/
|
19
|
+
export function getComments($jp: Joinpoint): Comment[] {
|
20
|
+
return $jp instanceof Comment ? [$jp] : $jp.inlineComments;
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Checks if a given join point is a comment statement
|
25
|
+
*
|
26
|
+
* @param $jp The join point to check
|
27
|
+
* @returns Returns true if the given join point is a comment statement, otherwise false
|
28
|
+
*/
|
29
|
+
export function isCommentStmt($jp: Joinpoint): boolean {
|
30
|
+
return $jp instanceof WrapperStmt && $jp.kind === "comment";
|
31
|
+
}
|
32
|
+
|
33
|
+
export function getParamReferences($param: Param, $startingPoint: Joinpoint): Varref[] {
|
34
|
+
return Query.searchFrom($startingPoint, Varref, (ref) => {
|
35
|
+
try {
|
36
|
+
return ref.decl && ref.decl.astId === $param.astId;
|
37
|
+
} catch (error) {
|
38
|
+
return false;
|
39
|
+
}
|
40
|
+
}).get();
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Checks if a storage class has external linkage
|
45
|
+
* @param $class - The storage class to check
|
46
|
+
* @returns Returns true if the class has external linkage, otherwise returns false
|
47
|
+
*/
|
48
|
+
export function hasExternalLinkage($class: StorageClass) {
|
49
|
+
return $class !== StorageClass.STATIC && $class !== StorageClass.EXTERN;
|
50
|
+
}
|
51
|
+
|
52
|
+
/**
|
53
|
+
* Retrieves all variables and functions that can be externed from the files, i.e.,
|
54
|
+
* elements with storage classes that are not `STATIC` or `EXTERN`
|
55
|
+
* @returns Array of functions and variables that can be externed
|
56
|
+
*/
|
57
|
+
export function getExternals(): (FunctionJp | Vardecl)[] {
|
58
|
+
let result: (FunctionJp | Vardecl)[] = [];
|
59
|
+
|
60
|
+
for (const file of Query.search(FileJp).get()) {
|
61
|
+
for(const child of file.children) {
|
62
|
+
if((child instanceof Vardecl || child instanceof FunctionJp) && hasExternalLinkage(child.storageClass)) {
|
63
|
+
result.push(child);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
return result;
|
68
|
+
}
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Checks if the provided node has a defined type
|
72
|
+
* @param $jp The joinpoint to check its type
|
73
|
+
* @returns true if the joinpoint has a defined type, otherwise false
|
74
|
+
*/
|
75
|
+
export function hasDefinedType($jp: Joinpoint): boolean {
|
76
|
+
return $jp.hasType && $jp.type !== null && $jp.type !== undefined;
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Retrieves the base type of the provided joinpoint.
|
81
|
+
* @param $jp The joinpoint to retrieve its type
|
82
|
+
* @returns The base type of the joinpoint, or undefined if the joinpoint does not have a type
|
83
|
+
*/
|
84
|
+
export function getBaseType($jp: Joinpoint): Type | undefined {
|
85
|
+
if (!hasDefinedType($jp)) return undefined;
|
86
|
+
let jpType = $jp.type;
|
87
|
+
|
88
|
+
while (jpType instanceof PointerType || jpType instanceof ArrayType) {
|
89
|
+
jpType = jpType instanceof PointerType ? jpType.pointee : jpType.elementType;
|
90
|
+
}
|
91
|
+
return jpType;
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Retrieves the typedef declaration for the provided joinpoint, if available
|
96
|
+
* @param $jp The joinpoint to analyze
|
97
|
+
* @returns The typedef declaration if found, or undefined if not
|
98
|
+
*/
|
99
|
+
export function getTypeDecl($jp: Joinpoint): TypedefDecl | undefined {
|
100
|
+
if ($jp instanceof DeclStmt && $jp.children.length === 1 && $jp.children[0] instanceof TypedefDecl)
|
101
|
+
return $jp.children[0];
|
102
|
+
|
103
|
+
if ($jp instanceof RecordJp || $jp instanceof EnumDecl) {
|
104
|
+
const typeDecls = Query.searchFrom($jp, TypedefDecl).get();
|
105
|
+
if (typeDecls.length === 1)
|
106
|
+
return typeDecls[0];
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
/**
|
111
|
+
* Checks if the provided joinpoint declares a type (typedef)
|
112
|
+
* @param $jp The joinpoint to check
|
113
|
+
* @returns Returns true if the joinpoint declares a typedef, otherwise false
|
114
|
+
*/
|
115
|
+
export function hasTypeDecl($jp: Joinpoint): boolean {
|
116
|
+
return getTypeDecl($jp) !== undefined;
|
117
|
+
}
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Retrieves all joinpoints with a defined type
|
121
|
+
* @returns Array of joinpoints with a defined type
|
122
|
+
*/
|
123
|
+
export function getTypedJps(startingPoint?: Joinpoint): Joinpoint[] {
|
124
|
+
if (startingPoint) {
|
125
|
+
return Query.searchFrom(startingPoint, Joinpoint, (jp) => hasDefinedType(jp)).get();
|
126
|
+
}
|
127
|
+
return Query.search(Joinpoint, (jp) => hasDefinedType(jp)).get();
|
128
|
+
}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Checks if a given joinpoint uses the specified tag declaration
|
132
|
+
* @param $jp The joinpoint to analyze
|
133
|
+
* @param tag The tag to check against
|
134
|
+
* @returns Returns true if the joinpoint uses the given tag, false otherwise
|
135
|
+
*/
|
136
|
+
export function isTagUsed($jp: Joinpoint, tag: RecordJp | EnumDecl): boolean {
|
137
|
+
const jpType = getBaseType($jp);
|
138
|
+
return jpType instanceof ElaboratedType &&
|
139
|
+
jpType.namedType instanceof TagType &&
|
140
|
+
jpType.namedType.decl.astId === tag.astId &&
|
141
|
+
$jp.astId !== getTypeDecl(tag)?.astId
|
142
|
+
}
|
143
|
+
|
144
|
+
/**
|
145
|
+
* Retrieves all joinpoints that use the specified tag declaration
|
146
|
+
*
|
147
|
+
* @param tag The tag to search for in the joinpoints
|
148
|
+
* @returns Array of joinpoints that use the specified tag declaration
|
149
|
+
*/
|
150
|
+
export function getTagUses(tag: RecordJp | EnumDecl): Joinpoint[] {
|
151
|
+
return getTypedJps().filter(jp => isTagUsed(jp, tag));
|
152
|
+
}
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Retrieves the last statement of the given case
|
156
|
+
* @param $jp - The case to retrieve the last statement from
|
157
|
+
* @returns The last statement of the case or undefined if there are no statements or it has a consecutive case.
|
158
|
+
*/
|
159
|
+
export function getLastStmtOfCase($jp: Case): Joinpoint | undefined {
|
160
|
+
if ($jp.instructions.length === 0) { // Has a consecutive case
|
161
|
+
return undefined;
|
162
|
+
}
|
163
|
+
|
164
|
+
let lastStmt: Joinpoint | undefined;
|
165
|
+
for (const stmt of $jp.siblingsRight) {
|
166
|
+
if (stmt instanceof Case) {
|
167
|
+
break;
|
168
|
+
}
|
169
|
+
lastStmt = stmt;
|
170
|
+
}
|
171
|
+
return lastStmt;
|
172
|
+
}
|
173
|
+
|
174
|
+
/**
|
175
|
+
* Retrieves the number of switch clauses with instructions in the provided switch statement
|
176
|
+
* @param $jp - The switch statement to analyze
|
177
|
+
* @returns The number of switch clauses with instructions
|
178
|
+
*/
|
179
|
+
export function getNumOfSwitchClauses($jp: Switch): number {
|
180
|
+
let firstStatements = []
|
181
|
+
|
182
|
+
for (const caseLabel of $jp.cases) {
|
183
|
+
if (caseLabel.instructions.length === 0) { // Has a consecutive case
|
184
|
+
continue;
|
185
|
+
}
|
186
|
+
firstStatements.push(caseLabel.instructions[0])
|
187
|
+
}
|
188
|
+
return firstStatements.length;
|
189
|
+
}
|
190
|
+
|
191
|
+
/**
|
192
|
+
* Checks if the provided switch statement has a Boolean condition
|
193
|
+
* @param switchStmt The switch statement to check
|
194
|
+
* @returns Returns true if the switch statement has a Boolean condition, otherwise false
|
195
|
+
*/
|
196
|
+
export function switchHasBooleanCondition(switchStmt: Switch): boolean {
|
197
|
+
return switchStmt.condition instanceof BinaryOp ||
|
198
|
+
(hasDefinedType(switchStmt.condition) &&
|
199
|
+
switchStmt.condition.type instanceof BuiltinType &&
|
200
|
+
switchStmt.condition.type.builtinKind === "Bool"
|
201
|
+
);
|
202
|
+
}
|
203
|
+
|
204
|
+
/**
|
205
|
+
* Checks if the provided switch statement contains any conditional break
|
206
|
+
*
|
207
|
+
* @param switchStmt - The switch statement to analyze
|
208
|
+
* @returns Returns true if the switch statement contains a conditional break, otherwise false
|
209
|
+
*/
|
210
|
+
export function switchHasConditionalBreak(switchStmt: Switch): boolean {
|
211
|
+
return Query.searchFrom(switchStmt, Break, { currentRegion: region => region.astId !== switchStmt.astId, enclosingStmt: jp => jp.astId === switchStmt.astId }).get().length > 0;
|
212
|
+
}
|
213
|
+
|
214
|
+
/**
|
215
|
+
* Checks if a file compiles correctly after adding a statement by rebuilding it.
|
216
|
+
* If rebuilding fails, the file is considered invalid with the new statement.
|
217
|
+
*
|
218
|
+
* @param fileJp - The file to validate.
|
219
|
+
*/
|
220
|
+
export function isValidFile(fileJp: FileJp) : boolean {
|
221
|
+
const programJp = fileJp.parent as Program;
|
222
|
+
let copyFile = ClavaJoinPoints.fileWithSource(`temp_misra_${fileJp.name}`, fileJp.code, fileJp.relativeFolderpath);
|
223
|
+
|
224
|
+
copyFile = programJp.addFile(copyFile) as FileJp;
|
225
|
+
try {
|
226
|
+
const rebuiltFile = copyFile.rebuild();
|
227
|
+
const fileToRemove = Query.searchFrom(programJp, FileJp, {filepath: rebuiltFile.filepath}).first();
|
228
|
+
fileToRemove?.detach();
|
229
|
+
return true;
|
230
|
+
} catch(error) {
|
231
|
+
copyFile.detach();
|
232
|
+
return false;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
/**
|
237
|
+
* Retrieves the list of header files included in the given file
|
238
|
+
*
|
239
|
+
* @param fileJp The file join point
|
240
|
+
* @returns An array of strings with the names of the includes
|
241
|
+
*/
|
242
|
+
export function getIncludesOfFile(fileJp: FileJp): string[] {
|
243
|
+
return fileJp.includes.map(includeJp => includeJp.name);
|
244
|
+
}
|
245
|
+
|
246
|
+
/**
|
247
|
+
* Removes a specific include directive from the given file, if it exists
|
248
|
+
*
|
249
|
+
* @param includeName The name of the include to remove
|
250
|
+
* @param fileJp The file from which the include should be removed
|
251
|
+
*/
|
252
|
+
export function removeIncludeFromFile(includeName: string, fileJp: FileJp) {
|
253
|
+
const include = Query.searchFrom(fileJp, Include, {name: includeName}).first();
|
254
|
+
include?.detach();
|
255
|
+
}
|
256
|
+
|
257
|
+
/**
|
258
|
+
* Check if the given joinpoint represents a call to an implicit function.
|
259
|
+
*
|
260
|
+
* @param callJp The call join point to analyze
|
261
|
+
*/
|
262
|
+
export function isCallToImplicitFunction(callJp: Call): boolean {
|
263
|
+
return callJp.function.definitionJp === undefined && !callJp.function.isInSystemHeader;
|
264
|
+
}
|
265
|
+
|
266
|
+
/**
|
267
|
+
* Returns all files in the program that contain at least one call to an implicit function
|
268
|
+
*
|
269
|
+
* @param programJp - The program to analyze
|
270
|
+
* @returns A list of files with implicit function calls
|
271
|
+
*/
|
272
|
+
export function getFilesWithCallToImplicitFunction(programJp: Program): FileJp[] {
|
273
|
+
const files = Query.searchFrom(programJp, FileJp).get();
|
274
|
+
return files.filter(
|
275
|
+
(fileJp) =>
|
276
|
+
Query.searchFrom(fileJp, Call, (callJp) =>
|
277
|
+
isCallToImplicitFunction(callJp)
|
278
|
+
).get().length > 0
|
279
|
+
);
|
280
|
+
}
|
package/tsconfig.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
|
-
"include": ["src/**/*.ts"],
|
3
|
-
"exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
|
2
|
+
"include": ["src/**/*.ts", "src/**/*.json"],
|
3
|
+
"exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts", "src/misra-old"],
|
4
4
|
"compilerOptions": {
|
5
5
|
"outDir": "dist",
|
6
6
|
"target": "ES2022",
|
@@ -12,7 +12,8 @@
|
|
12
12
|
"moduleResolution": "NodeNext",
|
13
13
|
"sourceMap": true,
|
14
14
|
"declarationMap": true,
|
15
|
-
"allowSyntheticDefaultImports": true
|
15
|
+
"allowSyntheticDefaultImports": true,
|
16
|
+
"resolveJsonModule": true
|
16
17
|
//"esModuleInterop": true
|
17
18
|
}
|
18
19
|
}
|
package/typedoc.config.js
CHANGED
package/CxxSources/lib.cpp
DELETED
package/CxxSources/lib.h
DELETED
package/CxxSources/main.cpp
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
void f ( void )
|
2
|
-
{
|
3
|
-
int x, y, z;
|
4
|
-
int flag;
|
5
|
-
switch (x) {
|
6
|
-
case 1:
|
7
|
-
z = y+x;
|
8
|
-
break;
|
9
|
-
case 2:
|
10
|
-
z = y-x;
|
11
|
-
break;
|
12
|
-
default:
|
13
|
-
z = 4;
|
14
|
-
break;
|
15
|
-
}
|
16
|
-
switch (flag) {
|
17
|
-
case 0:
|
18
|
-
x = 2;
|
19
|
-
break;
|
20
|
-
case 1:
|
21
|
-
x = 4;
|
22
|
-
break;
|
23
|
-
case 2:
|
24
|
-
x = 6;
|
25
|
-
break;
|
26
|
-
}
|
27
|
-
switch (z) {
|
28
|
-
case 1:
|
29
|
-
y = 0;
|
30
|
-
break;
|
31
|
-
case 6:
|
32
|
-
case 42:
|
33
|
-
y = 1;
|
34
|
-
break;
|
35
|
-
case 9139:
|
36
|
-
default:
|
37
|
-
y = 2;
|
38
|
-
break;
|
39
|
-
}
|
40
|
-
}
|
package/TODO.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
section 8 has a rule that hasn't been adapted yet
|
package/consumer_order.txt
DELETED
package/enum_integer_type.txt
DELETED
File without changes
|
package/is_temporary.txt
DELETED
File without changes
|
package/omp.txt
DELETED
File without changes
|