@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,105 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
3
|
+
import { BinaryOp, Call, ExprStmt, InitList, QualType, UnaryExprOrType, UnaryOp, Vardecl, Varref } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
import TraversalType from "@specs-feup/lara/api/weaver/TraversalType.js";
|
5
|
+
import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
|
6
|
+
export default class S13_SideEffectPass extends MISRAPass {
|
7
|
+
_preprocessingReqs = [];
|
8
|
+
initRuleMapper() {
|
9
|
+
this._ruleMapper = new Map([
|
10
|
+
[1, this.r13_1_initListSideEffects.bind(this)],
|
11
|
+
[3, this.r13_3_noIncrementSideEffects.bind(this)],
|
12
|
+
[4, this.r13_4_noUseOfAssignmentValue.bind(this)],
|
13
|
+
[5, this.r13_5_shortCircuitSideEffects.bind(this)],
|
14
|
+
[6, this.r13_6_sizeofSideEffects.bind(this)]
|
15
|
+
]);
|
16
|
+
}
|
17
|
+
matchJoinpoint($jp) {
|
18
|
+
return $jp instanceof InitList || $jp instanceof ExprStmt || $jp instanceof BinaryOp || $jp instanceof UnaryExprOrType;
|
19
|
+
}
|
20
|
+
checkPotentialPersistentSideEffects($startNode, name, childFun) {
|
21
|
+
Query.searchFromInclusive(childFun($startNode), Varref).get().forEach(ref => {
|
22
|
+
if (ref.type instanceof QualType && ref.type.qualifiers?.includes("volatile")) {
|
23
|
+
this.logMISRAError(`${name} ${$startNode.code} contains persistent side effects: an access to volatile object ${ref.name}.`);
|
24
|
+
}
|
25
|
+
}, this);
|
26
|
+
Query.searchFromInclusive(childFun($startNode), Call).get().forEach(call => {
|
27
|
+
this.logMISRAError(`${name} ${$startNode.code} may contain persistent side effects in call to ${call.name}.`);
|
28
|
+
}, this);
|
29
|
+
Query.searchFromInclusive(childFun($startNode), UnaryOp, { kind: /(post_inc)|(post_dec)|(pre_inc)|(pre_dec)/ }).get().forEach(op => {
|
30
|
+
Query.searchFrom(op, Varref).get().forEach(ref => {
|
31
|
+
if (ref.declaration instanceof Vardecl && ref.declaration.isGlobal) {
|
32
|
+
this.logMISRAError(`${name} ${$startNode.code} may contain persistent side effects in expression ${op.code}.`);
|
33
|
+
}
|
34
|
+
});
|
35
|
+
}, this);
|
36
|
+
}
|
37
|
+
r13_1_initListSideEffects($startNode) {
|
38
|
+
if (!($startNode instanceof InitList))
|
39
|
+
return;
|
40
|
+
this.checkPotentialPersistentSideEffects($startNode, "Initializer list", jp => jp);
|
41
|
+
}
|
42
|
+
static visitAllExprs(fun, root) {
|
43
|
+
let curr = root;
|
44
|
+
while (curr) {
|
45
|
+
const temp = curr;
|
46
|
+
//console.log(temp.joinPointType);
|
47
|
+
curr = curr.rightJp;
|
48
|
+
if (temp.instanceOf("expression")) {
|
49
|
+
fun(temp);
|
50
|
+
}
|
51
|
+
else
|
52
|
+
S13_SideEffectPass.visitAllExprs(fun, temp.children[0]);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
checkIncrementSideEffects(exprRoot) {
|
56
|
+
const jps = Query.searchFrom(exprRoot, UnaryOp, { kind: /(post_inc)|(post_dec)|(pre_inc)|(pre_dec)/ }, TraversalType.POSTORDER).get();
|
57
|
+
//THE ABOVE LINE ONLY WORKS BECAUSE SEARCH FROM IS RETURNING THE ROOT, SEARCH FROM INCLUSIVE RETURNS IT TWICE
|
58
|
+
const calls = Query.searchFromInclusive(exprRoot, Call).get();
|
59
|
+
const assignments = Query.searchFromInclusive(exprRoot, BinaryOp, { isAssignment: true }).get();
|
60
|
+
if (jps.length == 0 || jps.length + calls.length + assignments.length < 2)
|
61
|
+
return;
|
62
|
+
this.logMISRAError(`Expression ${exprRoot.code} contains a pre/post inc/decrement operator and other side effects.`, new Fix(exprRoot, ($jp) => {
|
63
|
+
const jps = Query.searchFrom($jp, UnaryOp, { kind: /(post_inc)|(post_dec)|(pre_inc)|(pre_dec)/ }, TraversalType.POSTORDER).get();
|
64
|
+
const calls = Query.searchFromInclusive($jp, Call).get();
|
65
|
+
const assignments = Query.searchFromInclusive($jp, BinaryOp, { isAssignment: true }).get();
|
66
|
+
const transformationNo = (calls.length === 0 && assignments.length === 0) ? jps.length - 1 : jps.length;
|
67
|
+
for (let i = 0; i < transformationNo; i++) {
|
68
|
+
const jp = jps[i];
|
69
|
+
if (/post_.*/.test(jp.kind)) {
|
70
|
+
$jp.insertAfter(jp.deepCopy());
|
71
|
+
}
|
72
|
+
else {
|
73
|
+
$jp.insertBefore(jp.deepCopy());
|
74
|
+
}
|
75
|
+
jp.replaceWith(jp.operand);
|
76
|
+
}
|
77
|
+
}));
|
78
|
+
}
|
79
|
+
r13_3_noIncrementSideEffects($startNode) {
|
80
|
+
if (!($startNode instanceof ExprStmt))
|
81
|
+
return;
|
82
|
+
this.checkIncrementSideEffects($startNode.expr);
|
83
|
+
//S13_SideEffectPass.visitAllExprs(this.checkIncrementSideEffects.bind(this), $startNode.expr);
|
84
|
+
}
|
85
|
+
r13_4_noUseOfAssignmentValue($startNode) {
|
86
|
+
if (!($startNode instanceof BinaryOp && $startNode.isAssignment))
|
87
|
+
return;
|
88
|
+
if (!$startNode.parent.instanceOf("exprStmt") && !($startNode.parent.instanceOf("parenExpr") && $startNode.parent?.parent?.instanceOf("exprStmt"))) {
|
89
|
+
this.logMISRAError(`Value of assignment expression ${$startNode.code} should not be used.`);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
r13_5_shortCircuitSideEffects($startNode) {
|
93
|
+
if (!($startNode instanceof BinaryOp && /(\&\&|\|\|)/.test($startNode.operator)))
|
94
|
+
return;
|
95
|
+
this.checkPotentialPersistentSideEffects($startNode, "RHS of && or || expression", jp => jp.right);
|
96
|
+
}
|
97
|
+
r13_6_sizeofSideEffects($startNode) {
|
98
|
+
if (!($startNode instanceof UnaryExprOrType && $startNode.hasArgExpr))
|
99
|
+
return;
|
100
|
+
//TODO: exception for volatile qualified lvalue that is not a variable length array
|
101
|
+
this.checkPotentialPersistentSideEffects($startNode.argExpr, "Sizeof operand", jp => jp);
|
102
|
+
}
|
103
|
+
_name = "Side effects";
|
104
|
+
}
|
105
|
+
//# sourceMappingURL=S13_SideEffectPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S13_SideEffectPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S13_SideEffectPass.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
3
|
+
import { PreprocessingReqs } from "../MISRAReporter.js";
|
4
|
+
export default class S15_ControlFlowPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
private _labelMap;
|
7
|
+
initRuleMapper(): void;
|
8
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
9
|
+
private r15_1_noGoto;
|
10
|
+
private static isBeforeInCode;
|
11
|
+
private r15_2_noBackJumps;
|
12
|
+
private computeLabelMap;
|
13
|
+
private r15_3_gotoBlockEnclosed;
|
14
|
+
private static countBreakExits;
|
15
|
+
private static countGotoExits;
|
16
|
+
private r15_4_loopSingleBreak;
|
17
|
+
protected _name: string;
|
18
|
+
}
|
19
|
+
//# sourceMappingURL=S15_ControlFlowPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S15_ControlFlowPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S15_ControlFlowPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IACtD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IACvD,OAAO,CAAC,SAAS,CAAqC;IAEtD,cAAc,IAAI,IAAI;IAStB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,MAAM,CAAC,cAAc;IAK7B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,OAAO,CAAC,qBAAqB;IAY7B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAkB;CAE5C"}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { Break, GotoStmt, LabelStmt, Loop } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
4
|
+
export default class S15_ControlFlowPass extends MISRAPass {
|
5
|
+
_preprocessingReqs = [];
|
6
|
+
_labelMap;
|
7
|
+
initRuleMapper() {
|
8
|
+
this._ruleMapper = new Map([
|
9
|
+
[1, this.r15_1_noGoto.bind(this)],
|
10
|
+
[2, this.r15_2_noBackJumps.bind(this)],
|
11
|
+
[3, this.r15_3_gotoBlockEnclosed.bind(this)],
|
12
|
+
[4, this.r15_4_loopSingleBreak.bind(this)]
|
13
|
+
]);
|
14
|
+
}
|
15
|
+
matchJoinpoint($jp) {
|
16
|
+
return $jp instanceof GotoStmt || $jp instanceof Loop;
|
17
|
+
}
|
18
|
+
r15_1_noGoto($startNode) {
|
19
|
+
if (!($startNode instanceof GotoStmt))
|
20
|
+
return;
|
21
|
+
this.logMISRAError("Goto statements should not be used");
|
22
|
+
}
|
23
|
+
static isBeforeInCode(line1, col1, line2, col2) {
|
24
|
+
if (line1 < line2)
|
25
|
+
return true;
|
26
|
+
else
|
27
|
+
return col1 < col2;
|
28
|
+
}
|
29
|
+
r15_2_noBackJumps($startNode) {
|
30
|
+
if (!($startNode instanceof GotoStmt))
|
31
|
+
return;
|
32
|
+
if (!S15_ControlFlowPass.isBeforeInCode($startNode.line, $startNode.column, $startNode.label.line, $startNode.label.column)) {
|
33
|
+
this.logMISRAError("Goto statements must not jump backwards in the code.");
|
34
|
+
}
|
35
|
+
}
|
36
|
+
computeLabelMap() {
|
37
|
+
this._labelMap = new Map();
|
38
|
+
Query.search(LabelStmt).get().forEach(stmt => this._labelMap?.set(stmt.decl.astId, stmt), this);
|
39
|
+
}
|
40
|
+
r15_3_gotoBlockEnclosed($startNode) {
|
41
|
+
if (!($startNode instanceof GotoStmt))
|
42
|
+
return;
|
43
|
+
if (!this._labelMap)
|
44
|
+
this.computeLabelMap();
|
45
|
+
let curr = $startNode.getAncestor("scope");
|
46
|
+
const ancestor = $startNode.getAncestor("function");
|
47
|
+
let error = true;
|
48
|
+
let temp;
|
49
|
+
do {
|
50
|
+
temp = curr;
|
51
|
+
if (curr.children.map(n => n.astId).includes(this._labelMap?.get($startNode.label.astId)?.astId)) {
|
52
|
+
error = false;
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
curr = curr.getAncestor("scope");
|
56
|
+
} while (temp.parent.astId !== ancestor.astId);
|
57
|
+
if (error) {
|
58
|
+
this.logMISRAError("The label of a goto statement must be declared in a block or switch clause enclosing the goto.");
|
59
|
+
}
|
60
|
+
}
|
61
|
+
static countBreakExits($startNode) {
|
62
|
+
let count = 0;
|
63
|
+
for (const goto of Query.searchFrom($startNode, Break)) {
|
64
|
+
const ancestor = goto.getAncestor("loop");
|
65
|
+
const switchAncestor = goto.getAncestor("switch");
|
66
|
+
if (ancestor.astId === $startNode.astId && !(switchAncestor && $startNode.contains(switchAncestor))) {
|
67
|
+
count++;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
return count;
|
71
|
+
}
|
72
|
+
static countGotoExits($startNode, labels) {
|
73
|
+
let count = 0;
|
74
|
+
for (const goto of Query.searchFrom($startNode, GotoStmt)) {
|
75
|
+
if (!($startNode.contains(labels.get(goto.label.astId)))) {
|
76
|
+
count++;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
return count;
|
80
|
+
}
|
81
|
+
r15_4_loopSingleBreak($startNode) {
|
82
|
+
if (!($startNode instanceof Loop))
|
83
|
+
return;
|
84
|
+
if (!this._labelMap)
|
85
|
+
this.computeLabelMap();
|
86
|
+
const breakExits = S15_ControlFlowPass.countBreakExits($startNode);
|
87
|
+
const gotoExits = S15_ControlFlowPass.countGotoExits($startNode, this._labelMap);
|
88
|
+
if (breakExits + gotoExits > 1) {
|
89
|
+
this.logMISRAError("Loops must only have one exit");
|
90
|
+
}
|
91
|
+
}
|
92
|
+
_name = "Control Flow";
|
93
|
+
}
|
94
|
+
//# sourceMappingURL=S15_ControlFlowPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S15_ControlFlowPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S15_ControlFlowPass.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
3
|
+
import { PreprocessingReqs } from "../MISRAReporter.js";
|
4
|
+
export default class S16_SwitchStatementPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
private _wellFormedSwitch;
|
7
|
+
initRuleMapper(): void;
|
8
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
9
|
+
private r16_1_16_3_wellFormedSwitch;
|
10
|
+
private r16_2_topLevelSwitchLabels;
|
11
|
+
private r16_4_switchHasDefault;
|
12
|
+
private r16_5_defaultFirstOrLast;
|
13
|
+
private r16_6_noTwoClauses;
|
14
|
+
private r16_7_noEssentialBooleanInSwitch;
|
15
|
+
protected _name: string;
|
16
|
+
}
|
17
|
+
//# sourceMappingURL=S16_SwitchStatementPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S16_SwitchStatementPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S16_SwitchStatementPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,SAAS;IAC1D,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IACvD,OAAO,CAAC,iBAAiB,CAAkB;IAE3C,cAAc,IAAI,IAAI;IAWtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,2BAA2B;IA4BnC,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,kBAAkB;IAwE1B,OAAO,CAAC,gCAAgC;IAUxC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAuB;CAEjD"}
|
@@ -0,0 +1,152 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { Break, BuiltinType, Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
|
4
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
5
|
+
export default class S16_SwitchStatementPass extends MISRAPass {
|
6
|
+
_preprocessingReqs = [];
|
7
|
+
_wellFormedSwitch = false;
|
8
|
+
initRuleMapper() {
|
9
|
+
this._ruleMapper = new Map([
|
10
|
+
[1, this.r16_1_16_3_wellFormedSwitch.bind(this)],
|
11
|
+
[2, this.r16_2_topLevelSwitchLabels.bind(this)],
|
12
|
+
[4, this.r16_4_switchHasDefault.bind(this)],
|
13
|
+
[5, this.r16_5_defaultFirstOrLast.bind(this)],
|
14
|
+
[6, this.r16_6_noTwoClauses.bind(this)],
|
15
|
+
[7, this.r16_7_noEssentialBooleanInSwitch.bind(this)]
|
16
|
+
]);
|
17
|
+
}
|
18
|
+
matchJoinpoint($jp) {
|
19
|
+
return $jp instanceof Switch || $jp instanceof Case;
|
20
|
+
}
|
21
|
+
r16_1_16_3_wellFormedSwitch($startNode) {
|
22
|
+
if (!($startNode instanceof Switch))
|
23
|
+
return;
|
24
|
+
this._wellFormedSwitch = true;
|
25
|
+
let foundStmt = false;
|
26
|
+
let first = true;
|
27
|
+
for (const child of $startNode.children[1].children) {
|
28
|
+
if (child instanceof Break) {
|
29
|
+
;
|
30
|
+
foundStmt = false;
|
31
|
+
}
|
32
|
+
else if (child instanceof Case) {
|
33
|
+
first = false;
|
34
|
+
}
|
35
|
+
else {
|
36
|
+
foundStmt = true;
|
37
|
+
}
|
38
|
+
if (foundStmt && child instanceof Case) {
|
39
|
+
this.logMISRAError(`A break is missing before ${child.code}`);
|
40
|
+
this._wellFormedSwitch = false;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
if (!($startNode.children[1].lastChild instanceof Break)) {
|
44
|
+
this.logMISRAError("A break is missing at the end of the switch statement.");
|
45
|
+
this._wellFormedSwitch = false;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
r16_2_topLevelSwitchLabels($startNode) {
|
49
|
+
if (!($startNode instanceof Case))
|
50
|
+
return;
|
51
|
+
if (!($startNode.currentRegion instanceof Switch)) {
|
52
|
+
this.logMISRAError("A switch label can only be used if its enclosing compound statement is the switch statement itself.");
|
53
|
+
}
|
54
|
+
}
|
55
|
+
r16_4_switchHasDefault($startNode) {
|
56
|
+
if (!($startNode instanceof Switch && !$startNode.hasDefaultCase))
|
57
|
+
return;
|
58
|
+
this.logMISRAError("Switch statement is missing a default case.");
|
59
|
+
}
|
60
|
+
r16_5_defaultFirstOrLast($startNode) {
|
61
|
+
if (!($startNode instanceof Switch))
|
62
|
+
return;
|
63
|
+
for (let i = 0; i < $startNode.cases.length; i++) {
|
64
|
+
if ($startNode.cases[i].isDefault && (i == 0 || i == $startNode.cases.length - 1)) {
|
65
|
+
return;
|
66
|
+
}
|
67
|
+
else if ($startNode.cases[i].isDefault) {
|
68
|
+
this.logMISRAError("The default case of a switch statement must be the first or last label.");
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
r16_6_noTwoClauses($startNode) {
|
74
|
+
if (!($startNode instanceof Switch))
|
75
|
+
return;
|
76
|
+
this.dependsOn(1, $startNode);
|
77
|
+
if (this._wellFormedSwitch === false)
|
78
|
+
return;
|
79
|
+
let clauses = 0;
|
80
|
+
for (const child of $startNode.children[1].children) {
|
81
|
+
if (child instanceof Break) {
|
82
|
+
clauses++;
|
83
|
+
}
|
84
|
+
}
|
85
|
+
if (clauses <= 2) {
|
86
|
+
this.logMISRAError("Switch statements should have more than two clauses.", new Fix($startNode, (switchStmt) => {
|
87
|
+
const switchJp = switchStmt;
|
88
|
+
let firstClauseExpr = undefined;
|
89
|
+
let secondClauseExpr = undefined;
|
90
|
+
let firstClause = [];
|
91
|
+
let secondClause = [];
|
92
|
+
let currClauseExpr = undefined;
|
93
|
+
let currClause = [];
|
94
|
+
let clauseHasDefault = false;
|
95
|
+
let filledFirstClause = false;
|
96
|
+
const newVar = ClavaJoinPoints.varDecl("switchToIf_" + switchJp.astId, switchJp.condition);
|
97
|
+
switchJp.insertBefore(newVar.stmt);
|
98
|
+
for (const child of switchStmt.children[1].children) {
|
99
|
+
if (child instanceof Case) {
|
100
|
+
let tempOp;
|
101
|
+
if (child.isDefault) {
|
102
|
+
clauseHasDefault = true;
|
103
|
+
continue;
|
104
|
+
}
|
105
|
+
else if (child.values.length === 1) {
|
106
|
+
tempOp = ClavaJoinPoints.binaryOp("eq", newVar.varref(), child.values[0]);
|
107
|
+
}
|
108
|
+
else {
|
109
|
+
tempOp = ClavaJoinPoints.binaryOp("l_or", ClavaJoinPoints.binaryOp("ge", newVar.varref(), child.values[0]), ClavaJoinPoints.binaryOp("le", newVar.varref(), child.values[1]));
|
110
|
+
}
|
111
|
+
currClauseExpr = currClauseExpr ? ClavaJoinPoints.binaryOp("l_or", currClauseExpr, tempOp) : tempOp;
|
112
|
+
}
|
113
|
+
else if (child instanceof Break) {
|
114
|
+
if (clauseHasDefault) {
|
115
|
+
secondClause = currClause;
|
116
|
+
secondClauseExpr = undefined;
|
117
|
+
}
|
118
|
+
else if (filledFirstClause) {
|
119
|
+
secondClause = currClause;
|
120
|
+
secondClauseExpr = currClauseExpr;
|
121
|
+
}
|
122
|
+
else {
|
123
|
+
firstClause = currClause;
|
124
|
+
firstClauseExpr = currClauseExpr;
|
125
|
+
filledFirstClause = true;
|
126
|
+
}
|
127
|
+
clauseHasDefault = false;
|
128
|
+
currClause = [];
|
129
|
+
currClauseExpr = undefined;
|
130
|
+
}
|
131
|
+
else {
|
132
|
+
currClause.push(child);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
const elseStmt = secondClauseExpr ? ClavaJoinPoints.ifStmt(secondClauseExpr, ClavaJoinPoints.scope(...secondClause)) : ClavaJoinPoints.scope(...secondClause);
|
136
|
+
switchJp.replaceWith(ClavaJoinPoints.ifStmt(firstClauseExpr ?? "", ClavaJoinPoints.scope(...firstClause), elseStmt));
|
137
|
+
}));
|
138
|
+
}
|
139
|
+
}
|
140
|
+
r16_7_noEssentialBooleanInSwitch($startNode) {
|
141
|
+
if (!($startNode instanceof Switch))
|
142
|
+
return;
|
143
|
+
this.dependsOn(1, $startNode);
|
144
|
+
if (this._wellFormedSwitch === false)
|
145
|
+
return;
|
146
|
+
if ($startNode.condition.type.desugarAll instanceof BuiltinType && $startNode.condition.type.desugarAll.builtinKind === "Bool") {
|
147
|
+
this.logMISRAError("The controlling expression of a switch statement must not have essentially boolean type.");
|
148
|
+
}
|
149
|
+
}
|
150
|
+
_name = "Switch statements";
|
151
|
+
}
|
152
|
+
//# sourceMappingURL=S16_SwitchStatementPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S16_SwitchStatementPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S16_SwitchStatementPass.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
3
|
+
import { PreprocessingReqs } from "../MISRAReporter.js";
|
4
|
+
export default class S17_FunctionPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
initRuleMapper(): void;
|
7
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
8
|
+
private r17_1_noStdargUsage;
|
9
|
+
private r17_7_returnValuesAreUsed;
|
10
|
+
protected _name: string;
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=S17_FunctionPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S17_FunctionPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S17_FunctionPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACnD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAMtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,yBAAyB;IAYjC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAe;CAEzC"}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { BuiltinType, Call, ExprStmt, Include } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
|
4
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
5
|
+
export default class S17_FunctionPass extends MISRAPass {
|
6
|
+
_preprocessingReqs = [];
|
7
|
+
initRuleMapper() {
|
8
|
+
this._ruleMapper = new Map([
|
9
|
+
[1, this.r17_1_noStdargUsage.bind(this)],
|
10
|
+
[7, this.r17_7_returnValuesAreUsed.bind(this)]
|
11
|
+
]);
|
12
|
+
}
|
13
|
+
matchJoinpoint($jp) {
|
14
|
+
return $jp instanceof Include || $jp instanceof Call;
|
15
|
+
}
|
16
|
+
r17_1_noStdargUsage($startNode) {
|
17
|
+
if (!($startNode instanceof Include))
|
18
|
+
return;
|
19
|
+
;
|
20
|
+
if ($startNode.name === "stdarg.h" && $startNode.isAngled) {
|
21
|
+
this.logMISRAError("Use of <stdarg.h> is not allowed.");
|
22
|
+
}
|
23
|
+
}
|
24
|
+
r17_7_returnValuesAreUsed($startNode) {
|
25
|
+
if (!($startNode instanceof Call))
|
26
|
+
return;
|
27
|
+
if ($startNode.returnType instanceof BuiltinType && $startNode.returnType.isVoid)
|
28
|
+
return;
|
29
|
+
if ($startNode.parent instanceof ExprStmt) {
|
30
|
+
this.logMISRAError(`Return value of ${$startNode.signature} must be used. It can be discarded with an explicit cast to void.`, new Fix($startNode, ($jp) => {
|
31
|
+
const newJp = ClavaJoinPoints.cStyleCast(ClavaJoinPoints.type("void"), $jp);
|
32
|
+
$jp.replaceWith(newJp);
|
33
|
+
}));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
_name = "Functions";
|
37
|
+
}
|
38
|
+
//# sourceMappingURL=S17_FunctionPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S17_FunctionPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S17_FunctionPass.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAa,MAAM,qCAAqC,CAAC;AACtG,OAAO,GAAG,MAAM,6CAA6C,CAAC;AAC9D,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACzC,kBAAkB,GAAwB,EAAE,CAAC;IAEvD,cAAc;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC;YACvB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC,CAAC;IACP,CAAC;IACD,cAAc,CAAC,GAAkB;QAC7B,OAAO,GAAG,YAAY,OAAO,IAAI,GAAG,YAAY,IAAI,CAAC;IACzD,CAAC;IAEO,mBAAmB,CAAC,UAAqB;QAC7C,IAAI,CAAC,CAAC,UAAU,YAAY,OAAO,CAAC;YAAE,OAAO;QAAA,CAAC;QAE9C,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxD,IAAI,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAEO,yBAAyB,CAAC,UAAqB;QACnD,IAAI,CAAC,CAAC,UAAU,YAAY,IAAI,CAAC;YAAE,OAAO;QAC1C,IAAI,UAAU,CAAC,UAAU,YAAY,WAAW,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO;QAEzF,IAAI,UAAU,CAAC,MAAM,YAAY,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,mBAAmB,UAAU,CAAC,SAAS,mEAAmE,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvJ,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAW,CAAC,CAAC;gBACpF,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;IACL,CAAC;IAES,KAAK,GAAW,WAAW,CAAC;CAEzC"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
3
|
+
import { PreprocessingReqs } from "../MISRAReporter.js";
|
4
|
+
export default class S18_PointersArraysPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
initRuleMapper(): void;
|
7
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
8
|
+
private static isPointerType;
|
9
|
+
private r18_4_noPointerArithmetic;
|
10
|
+
private static getDepth;
|
11
|
+
private static getUnderlyingType;
|
12
|
+
private r18_5_noExcessivePointerNesting;
|
13
|
+
private r18_7_noFlexibleArrayMembers;
|
14
|
+
private r18_8_noVariableLengthArrays;
|
15
|
+
protected _name: string;
|
16
|
+
}
|
17
|
+
//# sourceMappingURL=S18_PointersArraysPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S18_PointersArraysPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S18_PointersArraysPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,SAAS;IACzD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAQtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAkBvB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgBhC,OAAO,CAAC,+BAA+B;IA8BvC,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,4BAA4B;IAUpC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAyB;CAEnD"}
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { BinaryOp, Field, FunctionJp, FunctionType, Param, PointerType, QualType, Vardecl } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
export default class S18_PointersArraysPass extends MISRAPass {
|
4
|
+
_preprocessingReqs = [];
|
5
|
+
initRuleMapper() {
|
6
|
+
this._ruleMapper = new Map([
|
7
|
+
[4, this.r18_4_noPointerArithmetic.bind(this)],
|
8
|
+
[5, this.r18_5_noExcessivePointerNesting.bind(this)],
|
9
|
+
[7, this.r18_7_noFlexibleArrayMembers.bind(this)],
|
10
|
+
[8, this.r18_8_noVariableLengthArrays.bind(this)]
|
11
|
+
]);
|
12
|
+
}
|
13
|
+
matchJoinpoint($jp) {
|
14
|
+
return $jp instanceof BinaryOp || $jp instanceof Vardecl || $jp instanceof FunctionJp || $jp instanceof Field;
|
15
|
+
}
|
16
|
+
static isPointerType($type) {
|
17
|
+
const newT = $type.desugarAll;
|
18
|
+
if (newT instanceof QualType) {
|
19
|
+
return this.isPointerType(newT.unqualifiedType);
|
20
|
+
}
|
21
|
+
else
|
22
|
+
return newT.isPointer;
|
23
|
+
}
|
24
|
+
r18_4_noPointerArithmetic($startNode) {
|
25
|
+
if (!($startNode instanceof BinaryOp && /(\+=)|(-=)|(\+)|(-)/.test($startNode.operator)))
|
26
|
+
return;
|
27
|
+
const leftT = $startNode.left.type;
|
28
|
+
const rightT = $startNode.right.type;
|
29
|
+
if ((S18_PointersArraysPass.isPointerType(leftT) && !S18_PointersArraysPass.isPointerType(rightT))
|
30
|
+
|| (S18_PointersArraysPass.isPointerType(rightT) && !S18_PointersArraysPass.isPointerType(leftT))) {
|
31
|
+
this.logMISRAError("Pointer arithmetic is not allowed. The only exception is if two pointers to elements of the same array are subtracted.");
|
32
|
+
}
|
33
|
+
}
|
34
|
+
static getDepth(type) {
|
35
|
+
let depth = 0;
|
36
|
+
let curr = type.desugarAll;
|
37
|
+
while (curr.isPointer === true) {
|
38
|
+
depth++;
|
39
|
+
if (curr instanceof PointerType) {
|
40
|
+
curr = curr.pointee.desugarAll;
|
41
|
+
}
|
42
|
+
else if (curr instanceof QualType) {
|
43
|
+
curr = curr.unqualifiedType.pointee.desugarAll;
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
throw new Error(`Not supported for type ${curr.joinPointType}.`);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
return depth;
|
50
|
+
}
|
51
|
+
static getUnderlyingType(type) {
|
52
|
+
let curr = type.desugarAll;
|
53
|
+
while (curr.isPointer === true) {
|
54
|
+
if (curr instanceof PointerType) {
|
55
|
+
curr = curr.pointee.desugarAll;
|
56
|
+
}
|
57
|
+
else if (curr instanceof QualType) {
|
58
|
+
curr = curr.unqualifiedType.pointee.desugarAll;
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
throw new Error(`Not supported for type ${curr.joinPointType}.`);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
return curr;
|
65
|
+
}
|
66
|
+
r18_5_noExcessivePointerNesting($startNode) {
|
67
|
+
if (($startNode instanceof Vardecl && !($startNode instanceof Param)) || $startNode instanceof Field) {
|
68
|
+
const depth = S18_PointersArraysPass.getDepth($startNode.type);
|
69
|
+
const underlyingType = S18_PointersArraysPass.getUnderlyingType($startNode.type);
|
70
|
+
if (underlyingType instanceof FunctionType) {
|
71
|
+
const retDepth = S18_PointersArraysPass.getDepth(underlyingType.returnType);
|
72
|
+
const paramDepths = underlyingType.paramTypes.map(type => S18_PointersArraysPass.getDepth(type)).filter(d => d > 2);
|
73
|
+
if (retDepth > 2) {
|
74
|
+
this.logMISRAError(`Return type of function pointer ${$startNode.code} has more than two levels of indirection.`);
|
75
|
+
}
|
76
|
+
if (paramDepths.length > 0) {
|
77
|
+
this.logMISRAError(`One or more parameters of function pointer ${$startNode.code} have more than two levels of indirection.`);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
if (depth > 2) {
|
81
|
+
this.logMISRAError(`Type ${$startNode.type.code} has more than two levels of indirection.`);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
else if ($startNode instanceof FunctionJp) {
|
85
|
+
const retDepth = S18_PointersArraysPass.getDepth($startNode.functionType.returnType);
|
86
|
+
const paramDepths = $startNode.functionType.paramTypes.map(type => S18_PointersArraysPass.getDepth(type)).filter(d => d > 2);
|
87
|
+
if (retDepth > 2) {
|
88
|
+
this.logMISRAError(`Return type of function ${$startNode.signature} has more than two levels of indirection.`);
|
89
|
+
}
|
90
|
+
if (paramDepths.length > 0) {
|
91
|
+
this.logMISRAError(`One or more parameters of function ${$startNode.signature} have more than two levels of indirection.`);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
r18_7_noFlexibleArrayMembers($startNode) {
|
96
|
+
if (!($startNode instanceof Field))
|
97
|
+
return;
|
98
|
+
if (!$startNode.type.desugarAll.isArray || $startNode instanceof Param)
|
99
|
+
return;
|
100
|
+
if ($startNode.type.desugarAll.arraySize === -1) {
|
101
|
+
this.logMISRAError(`Array ${$startNode.name} has variable or undefined size.`);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
r18_8_noVariableLengthArrays($startNode) {
|
105
|
+
if (!($startNode instanceof Vardecl))
|
106
|
+
return;
|
107
|
+
if (!$startNode.type.desugarAll.isArray || $startNode.instanceOf("param"))
|
108
|
+
return;
|
109
|
+
if ($startNode.type.desugarAll.arraySize === -1) {
|
110
|
+
this.logMISRAError(`Array ${$startNode.name} has variable or undefined size.`);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
_name = "Pointers and arrays";
|
114
|
+
}
|
115
|
+
//# sourceMappingURL=S18_PointersArraysPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S18_PointersArraysPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S18_PointersArraysPass.ts"],"names":[],"mappings":"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"}
|