@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,42 @@
|
|
1
|
+
import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
3
|
+
import { PreprocessingReqs } from "../MISRAReporter.js";
|
4
|
+
import { Expression, Type } from "@specs-feup/clava/api/Joinpoints.js";
|
5
|
+
export declare enum EssentialTypes {
|
6
|
+
UNSIGNED = "unsigned",
|
7
|
+
CHAR = "char",
|
8
|
+
SIGNED = "signed",
|
9
|
+
ENUM = "enum",
|
10
|
+
FLOAT = "float",
|
11
|
+
BOOL = "bool",
|
12
|
+
UNKOWN = "unkown"
|
13
|
+
}
|
14
|
+
export interface EssentialType {
|
15
|
+
category: EssentialTypes;
|
16
|
+
enumName?: string;
|
17
|
+
}
|
18
|
+
export default class S10_EssentialTypePass extends MISRAPass {
|
19
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
20
|
+
initRuleMapper(): void;
|
21
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
22
|
+
static getEssentialType(bType: Type): EssentialType;
|
23
|
+
static isInteger($et: EssentialTypes): boolean;
|
24
|
+
static getExprEssentialType($expr: Expression): EssentialType;
|
25
|
+
private restrictOperand;
|
26
|
+
private restrictOperandList;
|
27
|
+
private r10_1_appropriateEssentialOperands;
|
28
|
+
private r10_2_appropriateCharOperands;
|
29
|
+
private static isAssignable;
|
30
|
+
private r10_3_noInvalidAssignments;
|
31
|
+
private static checkBoolSource;
|
32
|
+
private r10_5_noInvalidCasts;
|
33
|
+
private static isCompositeBinaryExpr;
|
34
|
+
private static isCompositeExpr;
|
35
|
+
private static compositeExprWidth;
|
36
|
+
private static transformBinaryOp;
|
37
|
+
private static transformTernaryOp;
|
38
|
+
private r10_6_noWiderCompositeExprAssignments;
|
39
|
+
private r10_8_noWiderCompositeCasts;
|
40
|
+
protected _name: string;
|
41
|
+
}
|
42
|
+
//# sourceMappingURL=S10_EssentialTypePass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S10_EssentialTypePass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S10_EssentialTypePass.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;AACxD,OAAO,EAA+C,UAAU,EAAiF,IAAI,EAAoB,MAAM,qCAAqC,CAAC;AAIrN,oBAAY,cAAc;IACtB,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACxD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAWtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,aAAa;IA8BnD,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO;IAI9C,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa;IAmB7D,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,kCAAkC;IAwD1C,OAAO,CAAC,6BAA6B;IAqCrC,OAAO,CAAC,MAAM,CAAC,YAAY;IAa3B,OAAO,CAAC,0BAA0B;IAuClC,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC,OAAO,CAAC,MAAM,CAAC,eAAe;IAiB9B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiBjC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,qCAAqC;IAqB7C,OAAO,CAAC,2BAA2B;IAwBnC,SAAS,CAAC,KAAK,EAAE,MAAM,CAA0B;CAEpD"}
|
@@ -0,0 +1,370 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { BinaryOp, BuiltinType, Call, Cast, EnumType, Expression, IntLiteral, ParenExpr, QualType, ReturnStmt, TernaryOp, UnaryOp, Vardecl } from "@specs-feup/clava/api/Joinpoints.js";
|
3
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
4
|
+
import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
|
5
|
+
export var EssentialTypes;
|
6
|
+
(function (EssentialTypes) {
|
7
|
+
EssentialTypes["UNSIGNED"] = "unsigned";
|
8
|
+
EssentialTypes["CHAR"] = "char";
|
9
|
+
EssentialTypes["SIGNED"] = "signed";
|
10
|
+
EssentialTypes["ENUM"] = "enum";
|
11
|
+
EssentialTypes["FLOAT"] = "float";
|
12
|
+
EssentialTypes["BOOL"] = "bool";
|
13
|
+
EssentialTypes["UNKOWN"] = "unkown";
|
14
|
+
})(EssentialTypes || (EssentialTypes = {}));
|
15
|
+
;
|
16
|
+
export default class S10_EssentialTypePass extends MISRAPass {
|
17
|
+
_preprocessingReqs = [];
|
18
|
+
initRuleMapper() {
|
19
|
+
this._ruleMapper = new Map([
|
20
|
+
[1, this.r10_1_appropriateEssentialOperands.bind(this)],
|
21
|
+
[2, this.r10_2_appropriateCharOperands.bind(this)],
|
22
|
+
[3, this.r10_3_noInvalidAssignments.bind(this)],
|
23
|
+
[5, this.r10_5_noInvalidCasts.bind(this)],
|
24
|
+
[6, this.r10_6_noWiderCompositeExprAssignments.bind(this)],
|
25
|
+
[8, this.r10_8_noWiderCompositeCasts.bind(this)]
|
26
|
+
]);
|
27
|
+
}
|
28
|
+
matchJoinpoint($jp) {
|
29
|
+
return $jp instanceof Expression || $jp instanceof Vardecl || $jp instanceof ReturnStmt;
|
30
|
+
}
|
31
|
+
static getEssentialType(bType) {
|
32
|
+
let type = bType.desugarAll;
|
33
|
+
while (type instanceof QualType) {
|
34
|
+
type = type.unqualifiedType.desugarAll;
|
35
|
+
}
|
36
|
+
if (type instanceof BuiltinType) {
|
37
|
+
if (type.builtinKind === "Bool") {
|
38
|
+
return { category: EssentialTypes.BOOL };
|
39
|
+
}
|
40
|
+
else if (type.builtinKind === "Char_S") {
|
41
|
+
return { category: EssentialTypes.CHAR };
|
42
|
+
}
|
43
|
+
else if (type.isInteger && type.isSigned === true) {
|
44
|
+
return { category: EssentialTypes.SIGNED };
|
45
|
+
}
|
46
|
+
else if (type.isInteger && type.isSigned === false) {
|
47
|
+
return { category: EssentialTypes.UNSIGNED };
|
48
|
+
}
|
49
|
+
else if (type.isFloat) {
|
50
|
+
return { category: EssentialTypes.FLOAT };
|
51
|
+
}
|
52
|
+
}
|
53
|
+
else if (type instanceof EnumType) {
|
54
|
+
return type.name === "" ? { category: EssentialTypes.SIGNED } : { category: EssentialTypes.ENUM, enumName: type.name };
|
55
|
+
}
|
56
|
+
return { category: EssentialTypes.UNKOWN };
|
57
|
+
}
|
58
|
+
static isInteger($et) {
|
59
|
+
return $et === EssentialTypes.SIGNED || $et === EssentialTypes.UNSIGNED;
|
60
|
+
}
|
61
|
+
static getExprEssentialType($expr) {
|
62
|
+
if ($expr instanceof BinaryOp) {
|
63
|
+
if ($expr.kind === "add") {
|
64
|
+
if ((this.getExprEssentialType($expr.left).category === EssentialTypes.CHAR && this.isInteger(this.getExprEssentialType($expr.right).category))
|
65
|
+
|| (this.getExprEssentialType($expr.right).category === EssentialTypes.CHAR && this.isInteger(this.getExprEssentialType($expr.left).category))) {
|
66
|
+
return { category: EssentialTypes.CHAR };
|
67
|
+
}
|
68
|
+
}
|
69
|
+
else if ($expr.kind === "sub") {
|
70
|
+
if (this.getExprEssentialType($expr.left).category === EssentialTypes.CHAR) {
|
71
|
+
if (this.getExprEssentialType($expr.right).category === EssentialTypes.CHAR) {
|
72
|
+
return { category: EssentialTypes.CHAR };
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
return this.getEssentialType($expr.type);
|
78
|
+
}
|
79
|
+
restrictOperand($expr, $restrictedType, $baseExpr, $castTo) {
|
80
|
+
const et = S10_EssentialTypePass.getExprEssentialType($expr);
|
81
|
+
if (et.category === $restrictedType) {
|
82
|
+
const fix = $castTo ? new Fix($expr, ($jp) => {
|
83
|
+
$jp.replaceWith(ClavaJoinPoints.cStyleCast($castTo, $jp));
|
84
|
+
}) : undefined;
|
85
|
+
this.logMISRAError(`Operand ${$expr.code} of expression ${$baseExpr.code} must not have essentially ${et.category} type.`, fix);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
restrictOperandList($expr, $restrictedTypes, $baseExpr, $castTo) {
|
89
|
+
for (const type of $restrictedTypes) {
|
90
|
+
this.restrictOperand($expr, type, $baseExpr, $castTo);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
r10_1_appropriateEssentialOperands($startNode) {
|
94
|
+
if ($startNode instanceof TernaryOp) {
|
95
|
+
this.restrictOperandList($startNode.cond, [EssentialTypes.CHAR, EssentialTypes.ENUM, EssentialTypes.FLOAT, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED], $startNode);
|
96
|
+
}
|
97
|
+
else if ($startNode instanceof BinaryOp) {
|
98
|
+
switch ($startNode.kind) {
|
99
|
+
case "shl":
|
100
|
+
case "shr":
|
101
|
+
if (!($startNode.right instanceof IntLiteral))
|
102
|
+
this.restrictOperand($startNode.right, EssentialTypes.SIGNED, $startNode);
|
103
|
+
case "and":
|
104
|
+
case "or":
|
105
|
+
case "x_or":
|
106
|
+
this.restrictOperand($startNode.left, EssentialTypes.SIGNED, $startNode);
|
107
|
+
if ($startNode.kind !== "shl" && $startNode.kind !== "shr")
|
108
|
+
this.restrictOperand($startNode.right, EssentialTypes.SIGNED, $startNode);
|
109
|
+
case "rem":
|
110
|
+
this.restrictOperand($startNode.left, EssentialTypes.FLOAT, $startNode);
|
111
|
+
this.restrictOperand($startNode.right, EssentialTypes.FLOAT, $startNode);
|
112
|
+
case "mul":
|
113
|
+
case "div":
|
114
|
+
this.restrictOperand($startNode.left, EssentialTypes.CHAR, $startNode);
|
115
|
+
this.restrictOperand($startNode.right, EssentialTypes.CHAR, $startNode);
|
116
|
+
case "add":
|
117
|
+
case "sub":
|
118
|
+
this.restrictOperand($startNode.left, EssentialTypes.ENUM, $startNode);
|
119
|
+
this.restrictOperand($startNode.right, EssentialTypes.ENUM, $startNode);
|
120
|
+
case "le":
|
121
|
+
case "ge":
|
122
|
+
case "lt":
|
123
|
+
case "gt":
|
124
|
+
this.restrictOperand($startNode.left, EssentialTypes.BOOL, $startNode);
|
125
|
+
this.restrictOperand($startNode.right, EssentialTypes.BOOL, $startNode);
|
126
|
+
break;
|
127
|
+
case "l_and":
|
128
|
+
case "l_or":
|
129
|
+
this.restrictOperandList($startNode.left, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
|
130
|
+
this.restrictOperandList($startNode.right, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
|
131
|
+
break;
|
132
|
+
}
|
133
|
+
}
|
134
|
+
else if ($startNode instanceof UnaryOp) {
|
135
|
+
switch ($startNode.kind) {
|
136
|
+
case "minus":
|
137
|
+
this.restrictOperand($startNode.operand, EssentialTypes.UNSIGNED, $startNode);
|
138
|
+
case "plus":
|
139
|
+
this.restrictOperandList($startNode.operand, [EssentialTypes.BOOL, EssentialTypes.CHAR, EssentialTypes.ENUM], $startNode);
|
140
|
+
break;
|
141
|
+
case "l_not":
|
142
|
+
this.restrictOperandList($startNode.operand, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
|
143
|
+
break;
|
144
|
+
case "not":
|
145
|
+
this.restrictOperandList($startNode.operand, [EssentialTypes.BOOL, EssentialTypes.CHAR, EssentialTypes.ENUM, EssentialTypes.FLOAT, EssentialTypes.SIGNED], $startNode);
|
146
|
+
break;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
r10_2_appropriateCharOperands($startNode) {
|
151
|
+
if (!($startNode instanceof BinaryOp))
|
152
|
+
return;
|
153
|
+
if ($startNode.kind === "add") {
|
154
|
+
if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR && S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
|
155
|
+
this.logMISRAError(`Both operands of addition ${$startNode.code} have essentially character type.`);
|
156
|
+
return;
|
157
|
+
}
|
158
|
+
let otherType;
|
159
|
+
if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR) {
|
160
|
+
otherType = S10_EssentialTypePass.getExprEssentialType($startNode.right);
|
161
|
+
}
|
162
|
+
else if (S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
|
163
|
+
otherType = S10_EssentialTypePass.getExprEssentialType($startNode.left);
|
164
|
+
}
|
165
|
+
if (otherType && !S10_EssentialTypePass.isInteger(otherType.category)) {
|
166
|
+
this.logMISRAError(`One operand of addition ${$startNode.code} has essentially character type, so the other one must have either essentially signed or unsigned type.`);
|
167
|
+
return;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
else if ($startNode.kind === "sub") {
|
171
|
+
if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR) {
|
172
|
+
const rightType = S10_EssentialTypePass.getExprEssentialType($startNode.right);
|
173
|
+
if (!([EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNKOWN].some(et => et === rightType.category))) {
|
174
|
+
this.logMISRAError(`Left operand of subtraction ${$startNode.code} has essentially character type, so the RHS must be essentially signed, unsigned, or char.`);
|
175
|
+
return;
|
176
|
+
}
|
177
|
+
}
|
178
|
+
else if (S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
|
179
|
+
this.logMISRAError(`Right operand of subtraction ${$startNode.code} can only be of essentially character type if the LHS is too.`);
|
180
|
+
return;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
}
|
184
|
+
static isAssignable($t1, $t2, $rhs) {
|
185
|
+
if ($t1.category === EssentialTypes.UNSIGNED && $rhs instanceof IntLiteral) {
|
186
|
+
return true;
|
187
|
+
}
|
188
|
+
else if ($t1.category !== $t2.category) {
|
189
|
+
return false;
|
190
|
+
}
|
191
|
+
else if ($t1.category === EssentialTypes.ENUM && $t1.enumName === $t2.enumName) {
|
192
|
+
return false;
|
193
|
+
}
|
194
|
+
else
|
195
|
+
return true;
|
196
|
+
}
|
197
|
+
r10_3_noInvalidAssignments($startNode) {
|
198
|
+
if ($startNode instanceof BinaryOp && $startNode.kind === "assign") {
|
199
|
+
if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getExprEssentialType($startNode.left), S10_EssentialTypePass.getExprEssentialType($startNode.right), $startNode.right)) {
|
200
|
+
this.logMISRAError(`Value ${$startNode.right.code} cannot be assigned to ${$startNode.left.code}, since it has a different essential type category.`);
|
201
|
+
}
|
202
|
+
else if ($startNode.left.bitWidth < $startNode.right.bitWidth) {
|
203
|
+
this.logMISRAError(`Value ${$startNode.right.code} cannot be assigned to ${$startNode.left.code} since it has a narrower type.`);
|
204
|
+
}
|
205
|
+
}
|
206
|
+
else if ($startNode instanceof Vardecl && $startNode.hasInit) {
|
207
|
+
if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getEssentialType($startNode.type), S10_EssentialTypePass.getExprEssentialType($startNode.init), $startNode.init)) {
|
208
|
+
this.logMISRAError(`Value ${$startNode.init.code} cannot be initialized in ${$startNode.code}, since it has a different essential type category.`);
|
209
|
+
}
|
210
|
+
else if ($startNode.bitWidth < $startNode.init.bitWidth) {
|
211
|
+
this.logMISRAError(`Value ${$startNode.init.code} cannot be initialized im ${$startNode.code} since it has a narrower type.`);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
else if ($startNode instanceof ReturnStmt && $startNode.returnExpr) {
|
215
|
+
const fun = $startNode.getAncestor("function");
|
216
|
+
if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getExprEssentialType($startNode.returnExpr), S10_EssentialTypePass.getEssentialType(fun.returnType), $startNode.returnExpr)) {
|
217
|
+
this.logMISRAError(`Value ${$startNode.returnExpr.code} cannot be returned by ${fun.signature}, since it has a different essential type category.`);
|
218
|
+
}
|
219
|
+
else if (fun.bitWidth < $startNode.returnExpr.bitWidth) {
|
220
|
+
this.logMISRAError(`Value ${$startNode.returnExpr.code} cannot be returned by ${fun.signature} since it has a narrower type.`);
|
221
|
+
}
|
222
|
+
}
|
223
|
+
else if ($startNode instanceof Call) {
|
224
|
+
const funParams = $startNode.directCallee.params;
|
225
|
+
for (let i = 0; i < funParams.length; i++) {
|
226
|
+
if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getEssentialType(funParams[i].type), S10_EssentialTypePass.getEssentialType($startNode.argList[i].type), $startNode.argList[i])) {
|
227
|
+
this.logMISRAError(`Value ${$startNode.argList[i].code} cannot be assigned to parameter ${funParams[i].code}, since it has a different essential type category.`);
|
228
|
+
}
|
229
|
+
else if (funParams[i].bitWidth < $startNode.argList[i].bitWidth) {
|
230
|
+
this.logMISRAError(`Value ${$startNode.argList[i].code} cannot be assigned to parameter ${funParams[i].code}, since it has a narrower type.`);
|
231
|
+
}
|
232
|
+
}
|
233
|
+
}
|
234
|
+
}
|
235
|
+
static checkBoolSource(subExpr) {
|
236
|
+
if (S10_EssentialTypePass.getExprEssentialType(subExpr).category === EssentialTypes.BOOL) {
|
237
|
+
return true;
|
238
|
+
}
|
239
|
+
else if (subExpr instanceof IntLiteral && (Number(subExpr.value) === 0 || Number(subExpr.value) === 1)) {
|
240
|
+
return true;
|
241
|
+
}
|
242
|
+
else
|
243
|
+
return false;
|
244
|
+
}
|
245
|
+
r10_5_noInvalidCasts($startNode) {
|
246
|
+
if (!($startNode instanceof Cast))
|
247
|
+
return;
|
248
|
+
const subExpr = $startNode.subExpr;
|
249
|
+
const toType = $startNode.toType.desugarAll;
|
250
|
+
const toEssentialType = S10_EssentialTypePass.getEssentialType(toType);
|
251
|
+
const fromEssentialType = S10_EssentialTypePass.getExprEssentialType(subExpr);
|
252
|
+
if (toEssentialType.category === EssentialTypes.BOOL && !S10_EssentialTypePass.checkBoolSource($startNode.subExpr)) {
|
253
|
+
this.logMISRAError("Only essentially boolean values, or the integer constants 0 or 1, may be cast to an essentially boolean type.");
|
254
|
+
}
|
255
|
+
else if ((toEssentialType.category === EssentialTypes.ENUM && fromEssentialType.category === EssentialTypes.ENUM && toEssentialType.enumName !== fromEssentialType.enumName)
|
256
|
+
|| (toEssentialType.category === EssentialTypes.ENUM && fromEssentialType.category !== EssentialTypes.ENUM)) {
|
257
|
+
this.logMISRAError("Only essentially enum values of the same enum may be cast to an essentially enum type.");
|
258
|
+
}
|
259
|
+
else if (toEssentialType.category === EssentialTypes.SIGNED && fromEssentialType.category === EssentialTypes.BOOL) {
|
260
|
+
this.logMISRAError("Essentially boolean values should not be cast to an essentially signed type.");
|
261
|
+
}
|
262
|
+
else if (toEssentialType.category === EssentialTypes.UNSIGNED && fromEssentialType.category === EssentialTypes.BOOL) {
|
263
|
+
this.logMISRAError("Essentially boolean values should not be cast to an essentially unsigned type.");
|
264
|
+
}
|
265
|
+
else if (toEssentialType.category === EssentialTypes.FLOAT && fromEssentialType.category === EssentialTypes.BOOL) {
|
266
|
+
this.logMISRAError("Essentially boolean values should not be cast to an essentially floating type.");
|
267
|
+
}
|
268
|
+
}
|
269
|
+
static isCompositeBinaryExpr($op) {
|
270
|
+
return /(add)|(sub)|(mul)|(div)|(rem)|(shl)|(shr)|(l_and)|(l_or)|(xor)/.test($op.kind);
|
271
|
+
}
|
272
|
+
static isCompositeExpr($expr) {
|
273
|
+
if ($expr instanceof ParenExpr) {
|
274
|
+
return this.isCompositeExpr($expr.subExpr);
|
275
|
+
}
|
276
|
+
else if ($expr instanceof BinaryOp) {
|
277
|
+
if (this.isCompositeBinaryExpr($expr)) {
|
278
|
+
return $expr;
|
279
|
+
}
|
280
|
+
}
|
281
|
+
else if ($expr instanceof TernaryOp) {
|
282
|
+
if (this.isCompositeExpr($expr.trueExpr) || this.isCompositeExpr($expr.falseExpr)) {
|
283
|
+
return $expr;
|
284
|
+
}
|
285
|
+
}
|
286
|
+
else
|
287
|
+
return undefined;
|
288
|
+
}
|
289
|
+
static compositeExprWidth($op) {
|
290
|
+
if ($op instanceof BinaryOp && S10_EssentialTypePass.isCompositeBinaryExpr($op)) {
|
291
|
+
const leftW = S10_EssentialTypePass.compositeExprWidth($op.left);
|
292
|
+
const rightW = S10_EssentialTypePass.compositeExprWidth($op.right);
|
293
|
+
return Math.max(leftW, rightW);
|
294
|
+
}
|
295
|
+
else if ($op instanceof TernaryOp) {
|
296
|
+
const secondW = S10_EssentialTypePass.compositeExprWidth($op.trueExpr);
|
297
|
+
const thirdW = S10_EssentialTypePass.compositeExprWidth($op.falseExpr);
|
298
|
+
return Math.min(secondW, thirdW);
|
299
|
+
}
|
300
|
+
else if ($op instanceof ParenExpr) {
|
301
|
+
return this.compositeExprWidth($op.subExpr);
|
302
|
+
}
|
303
|
+
else
|
304
|
+
return $op.bitWidth;
|
305
|
+
}
|
306
|
+
static transformBinaryOp($expr, $type) {
|
307
|
+
$expr.left.replaceWith(ClavaJoinPoints.cStyleCast($type, $expr.left));
|
308
|
+
}
|
309
|
+
static transformTernaryOp($expr, $type, $bitWidth) {
|
310
|
+
const trueExpr = this.isCompositeExpr($expr.trueExpr);
|
311
|
+
const falseExpr = this.isCompositeExpr($expr.falseExpr);
|
312
|
+
if (trueExpr && this.compositeExprWidth(trueExpr) < $bitWidth) {
|
313
|
+
if (trueExpr instanceof TernaryOp)
|
314
|
+
this.transformTernaryOp(trueExpr, $type, $bitWidth);
|
315
|
+
else if (trueExpr instanceof BinaryOp)
|
316
|
+
this.transformBinaryOp(trueExpr, $type);
|
317
|
+
}
|
318
|
+
if (falseExpr && this.compositeExprWidth(falseExpr) < $type.bitWidth) {
|
319
|
+
if (falseExpr instanceof TernaryOp)
|
320
|
+
this.transformTernaryOp(falseExpr, $type, $bitWidth);
|
321
|
+
else if (falseExpr instanceof BinaryOp)
|
322
|
+
this.transformBinaryOp(falseExpr, $type);
|
323
|
+
}
|
324
|
+
}
|
325
|
+
r10_6_noWiderCompositeExprAssignments($startNode) {
|
326
|
+
if (!($startNode instanceof Expression))
|
327
|
+
return;
|
328
|
+
const compositeExpr = S10_EssentialTypePass.isCompositeExpr($startNode);
|
329
|
+
if (compositeExpr) {
|
330
|
+
const parent = $startNode.parent;
|
331
|
+
if (parent instanceof BinaryOp && parent.kind === "assign") {
|
332
|
+
if (S10_EssentialTypePass.compositeExprWidth(compositeExpr) < parent.left.bitWidth) {
|
333
|
+
this.logMISRAError("A composite expression must not be assigned to a value with wider type.", new Fix(compositeExpr, op => {
|
334
|
+
if (op instanceof BinaryOp) {
|
335
|
+
S10_EssentialTypePass.transformBinaryOp(op, op.parent.type);
|
336
|
+
}
|
337
|
+
else if (op instanceof TernaryOp) {
|
338
|
+
op.replaceWith(ClavaJoinPoints.cStyleCast(op.parent.type, op));
|
339
|
+
}
|
340
|
+
}));
|
341
|
+
}
|
342
|
+
}
|
343
|
+
}
|
344
|
+
}
|
345
|
+
r10_8_noWiderCompositeCasts($startNode) {
|
346
|
+
if (!($startNode instanceof Cast))
|
347
|
+
return;
|
348
|
+
const compositeExpr = S10_EssentialTypePass.isCompositeExpr($startNode.subExpr);
|
349
|
+
if (compositeExpr) {
|
350
|
+
if (S10_EssentialTypePass.getEssentialType($startNode.fromType).category !== S10_EssentialTypePass.getEssentialType($startNode.toType).category) {
|
351
|
+
this.logMISRAError(`Composite expression ${$startNode.subExpr.code} cannot be cast to ${$startNode.toType.code}, since it has a different essential type category.`);
|
352
|
+
}
|
353
|
+
else if ($startNode.bitWidth > S10_EssentialTypePass.compositeExprWidth(compositeExpr)) {
|
354
|
+
this.logMISRAError(`Composite expression ${$startNode.subExpr.code} cannot be cast to ${$startNode.toType.code} since it is a wider type.`, new Fix($startNode, cast => {
|
355
|
+
const castJp = cast;
|
356
|
+
const compositeExpr = S10_EssentialTypePass.isCompositeExpr(castJp.subExpr);
|
357
|
+
if (compositeExpr instanceof BinaryOp) {
|
358
|
+
compositeExpr.left.replaceWith(ClavaJoinPoints.cStyleCast(cast.type, compositeExpr.left));
|
359
|
+
cast.replaceWith(compositeExpr);
|
360
|
+
}
|
361
|
+
else if (compositeExpr instanceof TernaryOp) {
|
362
|
+
S10_EssentialTypePass.transformTernaryOp(compositeExpr, cast.type, cast.bitWidth);
|
363
|
+
}
|
364
|
+
}));
|
365
|
+
}
|
366
|
+
}
|
367
|
+
}
|
368
|
+
_name = "Essential type model";
|
369
|
+
}
|
370
|
+
//# sourceMappingURL=S10_EssentialTypePass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S10_EssentialTypePass.js","sourceRoot":"","sources":["../../../src/misra/passes/S10_EssentialTypePass.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,18 @@
|
|
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 S12_ExpressionPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
initRuleMapper(): void;
|
7
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
8
|
+
private static isAdditive;
|
9
|
+
private static isMultiplicative;
|
10
|
+
private static isShift;
|
11
|
+
private static isRelational;
|
12
|
+
private static isEquality;
|
13
|
+
private static isSamePrecedence;
|
14
|
+
private r12_1_explicitPrecedence;
|
15
|
+
private r12_3_noCommaOperator;
|
16
|
+
protected _name: string;
|
17
|
+
}
|
18
|
+
//# sourceMappingURL=S12_ExpressionPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S12_ExpressionPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S12_ExpressionPass.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,kBAAmB,SAAQ,SAAS;IACrD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAMtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,qBAAqB;IAgB7B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAiB;CAE3C"}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import MISRAPass from "../MISRAPass.js";
|
2
|
+
import { BinaryOp, Loop, Op } 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 S12_ExpressionPass extends MISRAPass {
|
6
|
+
_preprocessingReqs = [];
|
7
|
+
initRuleMapper() {
|
8
|
+
this._ruleMapper = new Map([
|
9
|
+
[1, this.r12_1_explicitPrecedence.bind(this)],
|
10
|
+
[3, this.r12_3_noCommaOperator.bind(this)]
|
11
|
+
]);
|
12
|
+
}
|
13
|
+
matchJoinpoint($jp) {
|
14
|
+
return $jp instanceof BinaryOp && !$jp.isAssignment;
|
15
|
+
}
|
16
|
+
static isAdditive(op) {
|
17
|
+
return op === "add" || op === "sub";
|
18
|
+
}
|
19
|
+
static isMultiplicative(op) {
|
20
|
+
return op === "mul" || op === "div" || op === "rem";
|
21
|
+
}
|
22
|
+
static isShift(op) {
|
23
|
+
return op === "shl" || op === "shr";
|
24
|
+
}
|
25
|
+
static isRelational(op) {
|
26
|
+
return op === "lt" || op === "gt" || op === "le" || op === "ge";
|
27
|
+
}
|
28
|
+
static isEquality(op) {
|
29
|
+
return op === "eq" || op === "ne";
|
30
|
+
}
|
31
|
+
static isSamePrecedence(op1, op2) {
|
32
|
+
if (op1 === op2)
|
33
|
+
return true;
|
34
|
+
for (const fun of [this.isAdditive, this.isMultiplicative, this.isShift, this.isRelational, this.isEquality]) {
|
35
|
+
if (fun(op1) && fun(op2)) {
|
36
|
+
return true;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
r12_1_explicitPrecedence($startNode) {
|
42
|
+
if (!($startNode instanceof BinaryOp))
|
43
|
+
return;
|
44
|
+
if (($startNode.kind === "ptr_mem_d" || $startNode.kind === "ptr_mem_i")
|
45
|
+
|| (!$startNode.getAncestor("binaryOp") && !$startNode.getAncestor("ternaryOp"))
|
46
|
+
|| ($startNode.parent instanceof BinaryOp && $startNode.parent.isAssignment)
|
47
|
+
|| ($startNode.parent instanceof Op && S12_ExpressionPass.isSamePrecedence($startNode.kind, $startNode.parent.kind))
|
48
|
+
|| ($startNode.parent.instanceOf("parenExpr")))
|
49
|
+
return;
|
50
|
+
this.logMISRAError(`Operator precedence in expression ${$startNode.code} is not explicit.`, new Fix($startNode, ($jp) => {
|
51
|
+
const parenExpr = ClavaJoinPoints.parenthesis($jp);
|
52
|
+
$jp.replaceWith(parenExpr);
|
53
|
+
}));
|
54
|
+
}
|
55
|
+
r12_3_noCommaOperator($startNode) {
|
56
|
+
if (!($startNode instanceof BinaryOp && $startNode.operator === ","))
|
57
|
+
return;
|
58
|
+
const loopAncestor = $startNode.getAncestor("loop");
|
59
|
+
if (loopAncestor instanceof Loop && (loopAncestor?.step?.contains($startNode) || loopAncestor?.cond?.contains($startNode) || loopAncestor?.init?.contains($startNode))) {
|
60
|
+
console.log(`Cannot eliminate comma operator in expression ${$startNode.code} since it is at the head of a loop.`);
|
61
|
+
this.logMISRAError("Use of the comma operator is not allowed.");
|
62
|
+
}
|
63
|
+
else {
|
64
|
+
this.logMISRAError("Use of the comma operator is not allowed.", new Fix($startNode, ($jp) => {
|
65
|
+
$jp.insertBefore($jp.left.stmt);
|
66
|
+
$jp.replaceWith($jp.right);
|
67
|
+
}));
|
68
|
+
}
|
69
|
+
}
|
70
|
+
_name = "Expressions";
|
71
|
+
}
|
72
|
+
//# sourceMappingURL=S12_ExpressionPass.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S12_ExpressionPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S12_ExpressionPass.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,18 @@
|
|
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 S13_SideEffectPass extends MISRAPass {
|
5
|
+
protected _preprocessingReqs: PreprocessingReqs[];
|
6
|
+
initRuleMapper(): void;
|
7
|
+
matchJoinpoint($jp: LaraJoinPoint): boolean;
|
8
|
+
private checkPotentialPersistentSideEffects;
|
9
|
+
private r13_1_initListSideEffects;
|
10
|
+
private static visitAllExprs;
|
11
|
+
private checkIncrementSideEffects;
|
12
|
+
private r13_3_noIncrementSideEffects;
|
13
|
+
private r13_4_noUseOfAssignmentValue;
|
14
|
+
private r13_5_shortCircuitSideEffects;
|
15
|
+
private r13_6_sizeofSideEffects;
|
16
|
+
protected _name: string;
|
17
|
+
}
|
18
|
+
//# sourceMappingURL=S13_SideEffectPass.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"S13_SideEffectPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S13_SideEffectPass.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;AAMxD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,SAAS;IACrD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAUtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,mCAAmC;IAkB3C,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,uBAAuB;IAO/B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAkB;CAE5C"}
|