@specs-feup/clava-misra 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +117 -0
- package/README.md +70 -15
- package/dist/MISRA.d.ts +129 -0
- package/dist/MISRA.d.ts.map +1 -0
- package/dist/MISRA.js +245 -0
- package/dist/MISRA.js.map +1 -0
- package/dist/MISRAContext.d.ts +21 -0
- package/dist/MISRAContext.d.ts.map +1 -0
- package/dist/MISRAContext.js +75 -0
- package/dist/MISRAContext.js.map +1 -0
- package/dist/MISRARule.d.ts +56 -0
- package/dist/MISRARule.d.ts.map +1 -0
- package/dist/MISRARule.js +45 -0
- package/dist/MISRARule.js.map +1 -0
- package/dist/MISRATool.d.ts +12 -0
- package/dist/MISRATool.d.ts.map +1 -0
- package/dist/MISRATool.js +84 -0
- package/dist/MISRATool.js.map +1 -0
- package/dist/foo.d.ts +2 -0
- package/dist/foo.d.ts.map +1 -0
- package/{src/foo.ts → dist/foo.js} +3 -2
- package/dist/foo.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/misra/MISRAAnalyser.d.ts +14 -0
- package/dist/misra/MISRAAnalyser.d.ts.map +1 -0
- package/{src/misra/MISRAAnalyser.ts → dist/misra/MISRAAnalyser.js} +13 -23
- package/dist/misra/MISRAAnalyser.js.map +1 -0
- package/dist/misra/MISRAPass.d.ts +27 -0
- package/dist/misra/MISRAPass.d.ts.map +1 -0
- package/dist/misra/MISRAPass.js +60 -0
- package/dist/misra/MISRAPass.js.map +1 -0
- package/dist/misra/MISRAPassResult.d.ts +13 -0
- package/dist/misra/MISRAPassResult.d.ts.map +1 -0
- package/dist/misra/MISRAPassResult.js +11 -0
- package/dist/misra/MISRAPassResult.js.map +1 -0
- package/dist/misra/MISRAReporter.d.ts +20 -0
- package/dist/misra/MISRAReporter.d.ts.map +1 -0
- package/dist/misra/MISRAReporter.js +43 -0
- package/dist/misra/MISRAReporter.js.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts +42 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.js +370 -0
- package/dist/misra/passes/S10_EssentialTypePass.js.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts +18 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.js +72 -0
- package/dist/misra/passes/S12_ExpressionPass.js.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts +18 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.js +105 -0
- package/dist/misra/passes/S13_SideEffectPass.js.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts +19 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.js +94 -0
- package/dist/misra/passes/S15_ControlFlowPass.js.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts +17 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js +152 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts +12 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.js +38 -0
- package/dist/misra/passes/S17_FunctionPass.js.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts +17 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.js +115 -0
- package/dist/misra/passes/S18_PointersArraysPass.js.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts +11 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js +20 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts +20 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.js +77 -0
- package/dist/misra/passes/S21_StandardLibPass.js.map +1 -0
- package/dist/misra/passes/S3_CommentPass.d.ts +12 -0
- package/dist/misra/passes/S3_CommentPass.d.ts.map +1 -0
- package/dist/misra/passes/S3_CommentPass.js +27 -0
- package/dist/misra/passes/S3_CommentPass.js.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts +13 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.js +60 -0
- package/dist/misra/passes/S5_IdentifierPass.js.map +1 -0
- package/dist/misra/passes/S6_TypePass.d.ts +11 -0
- package/dist/misra/passes/S6_TypePass.d.ts.map +1 -0
- package/dist/misra/passes/S6_TypePass.js +25 -0
- package/dist/misra/passes/S6_TypePass.js.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts +14 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js +71 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts +18 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.js +127 -0
- package/dist/misra/passes/S8_DeclDefPass.js.map +1 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts +33 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts.map +1 -0
- package/{src/misra/sections/Section10_EssentialTypeModel.ts → dist/misra/sections/Section10_EssentialTypeModel.js} +58 -73
- package/dist/misra/sections/Section10_EssentialTypeModel.js.map +1 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts +12 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts.map +1 -0
- package/{src/misra/sections/Section11_PointerTypeConversions.ts → dist/misra/sections/Section11_PointerTypeConversions.js} +16 -27
- package/dist/misra/sections/Section11_PointerTypeConversions.js.map +1 -0
- package/dist/misra/sections/Section12_Expressions.d.ts +15 -0
- package/dist/misra/sections/Section12_Expressions.d.ts.map +1 -0
- package/dist/misra/sections/Section12_Expressions.js +70 -0
- package/dist/misra/sections/Section12_Expressions.js.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts +14 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.js +90 -0
- package/dist/misra/sections/Section13_SideEffects.js.map +1 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts +8 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts.map +1 -0
- package/{src/misra/sections/Section14_ControlStmtExprs.ts → dist/misra/sections/Section14_ControlStmtExprs.js} +8 -10
- package/dist/misra/sections/Section14_ControlStmtExprs.js.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts +14 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.js +97 -0
- package/dist/misra/sections/Section15_ControlFlow.js.map +1 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts +13 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts.map +1 -0
- package/{src/misra/sections/Section16_SwitchStatements.ts → dist/misra/sections/Section16_SwitchStatements.js} +49 -74
- package/dist/misra/sections/Section16_SwitchStatements.js.map +1 -0
- package/dist/misra/sections/Section17_Functions.d.ts +9 -0
- package/dist/misra/sections/Section17_Functions.d.ts.map +1 -0
- package/{src/misra/sections/Section17_Functions.ts → dist/misra/sections/Section17_Functions.js} +10 -13
- package/dist/misra/sections/Section17_Functions.js.map +1 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts +13 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts.map +1 -0
- package/{src/misra/sections/Section18_PointersAndArrays.ts → dist/misra/sections/Section18_PointersAndArrays.js} +36 -40
- package/dist/misra/sections/Section18_PointersAndArrays.js.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts +8 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js +16 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js.map +1 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts +8 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts.map +1 -0
- package/{src/misra/sections/Section20_PreprocessingDirectives.ts → dist/misra/sections/Section20_PreprocessingDirectives.js} +7 -9
- package/dist/misra/sections/Section20_PreprocessingDirectives.js.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts +17 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.js +54 -0
- package/dist/misra/sections/Section21_StandardLibraries.js.map +1 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts +9 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts.map +1 -0
- package/{src/misra/sections/Section2_UnusedCode.ts → dist/misra/sections/Section2_UnusedCode.js} +11 -16
- package/dist/misra/sections/Section2_UnusedCode.js.map +1 -0
- package/dist/misra/sections/Section3_Comments.d.ts +9 -0
- package/dist/misra/sections/Section3_Comments.d.ts.map +1 -0
- package/{src/misra/sections/Section3_Comments.ts → dist/misra/sections/Section3_Comments.js} +7 -10
- package/dist/misra/sections/Section3_Comments.js.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts +12 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.js +139 -0
- package/dist/misra/sections/Section5_Identifiers.js.map +1 -0
- package/dist/misra/sections/Section6_Types.d.ts +8 -0
- package/dist/misra/sections/Section6_Types.d.ts.map +1 -0
- package/dist/misra/sections/Section6_Types.js +23 -0
- package/dist/misra/sections/Section6_Types.js.map +1 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts +11 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts.map +1 -0
- package/{src/misra/sections/Section7_LiteralsConstants.ts → dist/misra/sections/Section7_LiteralsConstants.js} +18 -25
- package/dist/misra/sections/Section7_LiteralsConstants.js.map +1 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts +15 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts.map +1 -0
- package/{src/misra/sections/Section8_DeclarationsDefinitions.ts → dist/misra/sections/Section8_DeclarationsDefinitions.js} +18 -33
- package/dist/misra/sections/Section8_DeclarationsDefinitions.js.map +1 -0
- package/dist/misra/tests/utils.d.ts +10 -0
- package/dist/misra/tests/utils.d.ts.map +1 -0
- package/dist/misra/tests/utils.js +33 -0
- package/dist/misra/tests/utils.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +15 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +33 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +16 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +60 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +19 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +42 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +43 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +103 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +31 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +71 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +27 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +58 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +28 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +44 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts +55 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js +108 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +43 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +68 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +29 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +15 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +35 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +13 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +13 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +32 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts +10 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js +26 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js.map +1 -0
- package/dist/rules/index.d.ts +20 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +38 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/tests/Section17_Functions/misra_config.json +10 -0
- package/dist/tests/utils.d.ts +10 -0
- package/dist/tests/utils.d.ts.map +1 -0
- package/dist/tests/utils.js +29 -0
- package/dist/tests/utils.js.map +1 -0
- package/dist/utils/utils.d.ts +102 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +202 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.js +6 -6
- package/package.json +44 -8
- package/src/MISRA.ts +276 -0
- package/src/MISRAContext.ts +84 -0
- package/src/MISRARule.ts +64 -0
- package/src/MISRATool.ts +95 -0
- package/src/main.ts +4 -33
- package/src/misra-old/MISRAAnalyser.ts +60 -0
- package/src/misra-old/MISRAAnalyserResult.ts +16 -0
- package/src/misra-old/sections/Section10_EssentialTypeModel.ts +377 -0
- package/src/misra-old/sections/Section11_PointerTypeConversions.ts +104 -0
- package/src/{misra → misra-old}/sections/Section12_Expressions.ts +7 -7
- package/src/{misra → misra-old}/sections/Section13_SideEffects.ts +15 -15
- package/src/misra-old/sections/Section14_ControlStmtExprs.ts +27 -0
- package/src/{misra → misra-old}/sections/Section15_ControlFlow.ts +10 -10
- package/src/misra-old/sections/Section18_PointersAndArrays.ts +108 -0
- package/src/{misra → misra-old}/sections/Section19_OverlappingStorage.ts +4 -4
- package/src/misra-old/sections/Section20_PreprocessingDirectives.ts +22 -0
- package/src/misra-old/sections/Section21_StandardLibraries.ts +99 -0
- package/src/{misra → misra-old}/sections/Section5_Identifiers.ts +16 -15
- package/src/{misra → misra-old}/sections/Section6_Types.ts +4 -4
- package/src/misra-old/sections/Section7_LiteralsConstants.ts +76 -0
- package/src/misra-old/sections/Section8_DeclarationsDefinitions.ts +133 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +70 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +113 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +61 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +57 -0
- package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +180 -0
- package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +91 -0
- package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
- package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +49 -0
- package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
- package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +78 -0
- package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +61 -0
- package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +47 -0
- package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +67 -0
- package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +41 -0
- package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +36 -0
- package/src/rules/index.ts +44 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +55 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +70 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +128 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +132 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +146 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +102 -0
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +79 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +98 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +77 -0
- package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -0
- package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +44 -0
- package/src/tests/Section17_Functions/misra_config.json +19 -0
- package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +175 -0
- package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +219 -0
- package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +49 -0
- package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +55 -0
- package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -0
- package/src/tests/utils.ts +51 -0
- package/src/utils/utils.ts +280 -0
- package/tsconfig.json +4 -3
- package/typedoc.config.js +1 -1
- package/CxxSources/lib.cpp +0 -3
- package/CxxSources/lib.h +0 -8
- package/CxxSources/main.cpp +0 -40
- package/TODO.md +0 -1
- package/consumer_order.txt +0 -2
- package/enum_integer_type.txt +0 -0
- package/is_temporary.txt +0 -0
- package/omp.txt +0 -0
- package/src/misra/passes/S16_SwitchStatementPass.ts +0 -168
- package/src/misra/passes/S3_CommentPass.ts +0 -40
- package/src/misra/sections/Section21_StandardLibraries.ts +0 -65
- package/src/misra/tests/S10_EssentialTypes.test.ts +0 -253
- package/src/misra/tests/S12_Expressions.test.ts +0 -43
- package/src/misra/tests/S13_SideEffects.test.ts +0 -77
- package/src/misra/tests/S15_ControlFlow.test.ts +0 -144
- package/src/misra/tests/S16_SwitchStatements.test.ts +0 -164
- package/src/misra/tests/S17_Functions.test.ts +0 -46
- package/src/misra/tests/S18_PointersArrays.test.ts +0 -167
- package/src/misra/tests/S19_OverlappingStorage.test.ts +0 -38
- package/src/misra/tests/S3_Comments.test.ts +0 -36
- package/src/misra/tests/S6_Types.test.ts +0 -36
- package/src/misra/tests/S7_LiteralsConstants.test.ts +0 -48
- package/src/misra/tests/utils.ts +0 -47
- package/types_with_templates.txt +0 -0
- /package/src/{misra → misra-old}/MISRAPass.ts +0 -0
- /package/src/{misra → misra-old}/MISRAPassResult.ts +0 -0
- /package/src/{misra → misra-old}/MISRAReporter.ts +0 -0
- /package/src/{misra → misra-old}/passes/S10_EssentialTypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S12_ExpressionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S13_SideEffectPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S15_ControlFlowPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S17_FunctionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S18_PointersArraysPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S19_OverlappingStoragePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S21_StandardLibPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S5_IdentifierPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S6_TypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S7_LiteralsConstantsPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S8_DeclDefPass.ts +0 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
import path from "path";
|
5
|
+
import { fileURLToPath } from "url";
|
6
|
+
|
7
|
+
const passingCode = `
|
8
|
+
unsigned int test_17_4_1() {
|
9
|
+
return 0;
|
10
|
+
}`;
|
11
|
+
|
12
|
+
const failingCode = `
|
13
|
+
unsigned int test_17_4_2() {
|
14
|
+
|
15
|
+
}`;
|
16
|
+
|
17
|
+
const failingCode2 = `
|
18
|
+
float test_17_4_3() {
|
19
|
+
|
20
|
+
}`;
|
21
|
+
|
22
|
+
const failingCode3 = `
|
23
|
+
enum Status {
|
24
|
+
FAIL,
|
25
|
+
SUCCESS
|
26
|
+
};
|
27
|
+
|
28
|
+
typedef enum {
|
29
|
+
RED,
|
30
|
+
GREEN,
|
31
|
+
} Color;
|
32
|
+
|
33
|
+
typedef enum {
|
34
|
+
SMALL,
|
35
|
+
LARGE
|
36
|
+
} Size;
|
37
|
+
|
38
|
+
typedef unsigned int my_int_type;
|
39
|
+
|
40
|
+
// Non-compliant
|
41
|
+
enum Status test_17_4_3() {
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
// Non-compliant
|
46
|
+
Color test_17_4_4() {
|
47
|
+
|
48
|
+
}
|
49
|
+
|
50
|
+
// Non-compliant
|
51
|
+
my_int_type test_17_4_5() {
|
52
|
+
|
53
|
+
}
|
54
|
+
|
55
|
+
/*
|
56
|
+
Non-compliant after correction:
|
57
|
+
Config file specifies an invalid default value for 'Size' type (e.g: MEDIUM)
|
58
|
+
*/
|
59
|
+
Size test_17_4_6() {
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
/*
|
64
|
+
Non-compliant after correction:
|
65
|
+
Config file do not specify the default value for 'double' type
|
66
|
+
*/
|
67
|
+
double test_17_4_7() {
|
68
|
+
}
|
69
|
+
`;
|
70
|
+
|
71
|
+
const files: TestFile[] = [
|
72
|
+
{ name: "bad1.c", code: failingCode },
|
73
|
+
{ name: "bad2.c", code: failingCode2 },
|
74
|
+
{ name: "bad3.c", code: failingCode3 },
|
75
|
+
{ name: "good.c", code: passingCode },
|
76
|
+
];
|
77
|
+
|
78
|
+
describe("Rule 17.4", () => {
|
79
|
+
registerSourceCode(files);
|
80
|
+
|
81
|
+
it("should detect errors", () => {
|
82
|
+
expect(countMISRAErrors()).toBe(7);
|
83
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad1.c" }).first()!)).toBe(1);
|
84
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad2.c" }).first()!)).toBe(1);
|
85
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad3.c" }).first()!)).toBe(5);
|
86
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
|
87
|
+
});
|
88
|
+
|
89
|
+
it("should correct errors", () => {
|
90
|
+
const __filename = fileURLToPath(import.meta.url);
|
91
|
+
const __dirname = path.dirname(__filename);
|
92
|
+
|
93
|
+
const configFilename = "misra_config.json";
|
94
|
+
const configFilePath = path.join(__dirname, configFilename);
|
95
|
+
|
96
|
+
expect(countErrorsAfterCorrection(configFilePath)).toBe(2);
|
97
|
+
});
|
98
|
+
});
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const passingCode = `
|
6
|
+
unsigned int test_17_4_1() {
|
7
|
+
return 0;
|
8
|
+
}`;
|
9
|
+
|
10
|
+
const failingCode = `
|
11
|
+
unsigned int test_17_4_2() {
|
12
|
+
|
13
|
+
}`;
|
14
|
+
|
15
|
+
const failingCode2 = `
|
16
|
+
float test_17_4_3() {
|
17
|
+
|
18
|
+
}`;
|
19
|
+
|
20
|
+
const failingCode3 = `
|
21
|
+
enum Status {
|
22
|
+
FAIL,
|
23
|
+
SUCCESS
|
24
|
+
};
|
25
|
+
|
26
|
+
typedef enum {
|
27
|
+
RED,
|
28
|
+
GREEN,
|
29
|
+
} Color;
|
30
|
+
|
31
|
+
typedef unsigned int my_int_type;
|
32
|
+
|
33
|
+
// Non-compliant
|
34
|
+
enum Status test_17_4_3() {
|
35
|
+
|
36
|
+
}
|
37
|
+
|
38
|
+
// Non-compliant
|
39
|
+
Color test_17_4_4() {
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
// Non-compliant
|
44
|
+
my_int_type test_17_4_5() {
|
45
|
+
|
46
|
+
}
|
47
|
+
|
48
|
+
/*
|
49
|
+
Non-compliant after correction:
|
50
|
+
Config file do not specify the default value for 'double' type
|
51
|
+
*/
|
52
|
+
double test_17_4_6() {
|
53
|
+
}
|
54
|
+
`;
|
55
|
+
|
56
|
+
const files: TestFile[] = [
|
57
|
+
{ name: "bad1.c", code: failingCode },
|
58
|
+
{ name: "bad2.c", code: failingCode2 },
|
59
|
+
{ name: "bad3.c", code: failingCode3 },
|
60
|
+
{ name: "good.c", code: passingCode },
|
61
|
+
];
|
62
|
+
|
63
|
+
describe("Rule 17.4 (without config)", () => {
|
64
|
+
registerSourceCode(files);
|
65
|
+
|
66
|
+
it("should detect errors", () => {
|
67
|
+
expect(countMISRAErrors()).toBe(6);
|
68
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad1.c" }).first()!)).toBe(1);
|
69
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad2.c" }).first()!)).toBe(1);
|
70
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad3.c" }).first()!)).toBe(4);
|
71
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
|
72
|
+
});
|
73
|
+
|
74
|
+
it("should correct errors", () => {
|
75
|
+
expect(countErrorsAfterCorrection()).toBe(6);
|
76
|
+
});
|
77
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const passingCode = `
|
6
|
+
int test_17_6_1(int my_array[]) {
|
7
|
+
return my_array[0];
|
8
|
+
}`;
|
9
|
+
|
10
|
+
const failingCode = `
|
11
|
+
int test_17_6_2(int my_array[static 10]) {
|
12
|
+
return my_array[0];
|
13
|
+
}`;
|
14
|
+
|
15
|
+
const files: TestFile[] = [
|
16
|
+
{ name: "bad.c", code: failingCode },
|
17
|
+
{ name: "good.c", code: passingCode }
|
18
|
+
];
|
19
|
+
|
20
|
+
describe("Rule 17.6", () => {
|
21
|
+
if (process.env.STD_VERSION === "c90") {
|
22
|
+
it("should skip tests for c90", () => {});
|
23
|
+
} else {
|
24
|
+
registerSourceCode(files);
|
25
|
+
|
26
|
+
it("should detect errors in bad.c", () => {
|
27
|
+
expect(countMISRAErrors()).toBe(1);
|
28
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "bad.c" }).first()!)).toBe(1);
|
29
|
+
expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
|
30
|
+
});
|
31
|
+
|
32
|
+
it("should correct errors in bad.c", () => {
|
33
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
34
|
+
});
|
35
|
+
}
|
36
|
+
});
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const programCode = `
|
6
|
+
void my_void_func() {
|
7
|
+
// Void function
|
8
|
+
}
|
9
|
+
|
10
|
+
unsigned int foo() {
|
11
|
+
return 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
unsigned int bar(unsigned int n) {
|
15
|
+
return n*n;
|
16
|
+
}
|
17
|
+
|
18
|
+
int main() {
|
19
|
+
my_void_func(); // Compliant - call to void function
|
20
|
+
|
21
|
+
unsigned int result = foo();
|
22
|
+
(void) bar(foo());
|
23
|
+
|
24
|
+
foo(); // Non-compliant
|
25
|
+
|
26
|
+
return 0;
|
27
|
+
}
|
28
|
+
`;
|
29
|
+
|
30
|
+
const files: TestFile[] = [
|
31
|
+
{ name: "program.c", code: programCode }
|
32
|
+
];
|
33
|
+
|
34
|
+
describe("Rule 17.7", () => {
|
35
|
+
registerSourceCode(files);
|
36
|
+
|
37
|
+
it("should detect errors", () => {
|
38
|
+
expect(countMISRAErrors()).toBe(1);
|
39
|
+
});
|
40
|
+
|
41
|
+
it("should correct errors", () => {
|
42
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
43
|
+
});
|
44
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"defaultValues": {
|
3
|
+
"int": 0,
|
4
|
+
"unsigned int": 0,
|
5
|
+
"float": 0.0,
|
6
|
+
"enum Status": "SUCCESS",
|
7
|
+
"Color": "RED",
|
8
|
+
"Size": "MEDIUM",
|
9
|
+
"my_int_type": 0
|
10
|
+
},
|
11
|
+
"implicitCalls": {
|
12
|
+
"printf": "stdio.h",
|
13
|
+
"print": "stdio.h",
|
14
|
+
"sin": "math.h",
|
15
|
+
"pow": "math.h",
|
16
|
+
"half": "math.h",
|
17
|
+
"println": "stdio.h"
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,175 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { EnumDecl, FileJp, RecordJp, TypedefDecl } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const passingCode = `
|
6
|
+
typedef int MyInt;
|
7
|
+
typedef MyInt AliasInt;
|
8
|
+
|
9
|
+
typedef int BasicInt;
|
10
|
+
typedef BasicInt* PtrToBasicInt;
|
11
|
+
|
12
|
+
typedef int MyInt2;
|
13
|
+
typedef int MyInt3;
|
14
|
+
typedef int MyInt4;
|
15
|
+
|
16
|
+
typedef struct {
|
17
|
+
int x;
|
18
|
+
int y;
|
19
|
+
MyInt2 i2;
|
20
|
+
MyInt3 i3[4];
|
21
|
+
MyInt4 *i4;
|
22
|
+
} MyStruct;
|
23
|
+
|
24
|
+
typedef int MyInt5;
|
25
|
+
typedef union {
|
26
|
+
int x;
|
27
|
+
int y;
|
28
|
+
MyInt5 i5;
|
29
|
+
} MyUnion;
|
30
|
+
|
31
|
+
typedef int BasicInt2;
|
32
|
+
void foo(BasicInt2 x) {
|
33
|
+
int a = x + 1;
|
34
|
+
}
|
35
|
+
|
36
|
+
typedef int BasicInt3;
|
37
|
+
BasicInt3 bar() {
|
38
|
+
return (BasicInt3)10;
|
39
|
+
}
|
40
|
+
|
41
|
+
int main() {
|
42
|
+
AliasInt a = 1;
|
43
|
+
BasicInt x = 10;
|
44
|
+
MyInt4 y = 11;
|
45
|
+
|
46
|
+
MyStruct myStructInstance = {1, 2, 3, {4, 5, 6, 7}, &y};
|
47
|
+
|
48
|
+
MyUnion myUnionInstance;
|
49
|
+
myUnionInstance.x = 100;
|
50
|
+
|
51
|
+
PtrToBasicInt ptr = &x;
|
52
|
+
|
53
|
+
return 0;
|
54
|
+
}`;
|
55
|
+
|
56
|
+
// 3 errors
|
57
|
+
const failingCode1 = `
|
58
|
+
typedef int OtherInt;
|
59
|
+
|
60
|
+
// Unused type defs
|
61
|
+
typedef OtherInt** OtherPointer;
|
62
|
+
typedef int MyUnusedType;
|
63
|
+
typedef int** MyUnusedPointer;
|
64
|
+
`;
|
65
|
+
|
66
|
+
// 4 errors, where 1 is the unused tag decl
|
67
|
+
const failingCode2 = `
|
68
|
+
// Should be removed
|
69
|
+
typedef struct {
|
70
|
+
int x;
|
71
|
+
int y;
|
72
|
+
} MyUnusedStruct;
|
73
|
+
|
74
|
+
// Should be removed
|
75
|
+
typedef struct NumberEnum {
|
76
|
+
int x;
|
77
|
+
int y;
|
78
|
+
} MyUnusedStruct2;
|
79
|
+
|
80
|
+
// Should be replaced by the struct
|
81
|
+
typedef struct PersonStruct {
|
82
|
+
int id;
|
83
|
+
char name[10];
|
84
|
+
} Person;
|
85
|
+
struct PersonStruct personInstance = {1, "Alice"};
|
86
|
+
`;
|
87
|
+
|
88
|
+
// 4 errors, one is from the other class
|
89
|
+
const failingCode3 = `
|
90
|
+
// Should be removed
|
91
|
+
typedef union {
|
92
|
+
int x;
|
93
|
+
int y;
|
94
|
+
} MyUnusedUnion1;
|
95
|
+
|
96
|
+
// Should be removed
|
97
|
+
typedef union NumberUnion1 {
|
98
|
+
int x;
|
99
|
+
int y;
|
100
|
+
} MyUnusedUnion2;
|
101
|
+
|
102
|
+
// Should be replaced by the union
|
103
|
+
typedef union NumberUnion {
|
104
|
+
int intValue;
|
105
|
+
float floatValue;
|
106
|
+
} Number;
|
107
|
+
|
108
|
+
union NumberUnion unionInst = {.intValue = 10};
|
109
|
+
`;
|
110
|
+
|
111
|
+
// 4 errors, one is from the other class
|
112
|
+
const failingCode4 = `
|
113
|
+
// Should be removed
|
114
|
+
typedef enum {
|
115
|
+
A1,
|
116
|
+
B1,
|
117
|
+
C1
|
118
|
+
} MyUnusedEnum;
|
119
|
+
|
120
|
+
// Should be removed
|
121
|
+
typedef enum ColorEnum2 {
|
122
|
+
YELLOW,
|
123
|
+
BROWN,
|
124
|
+
WHITE
|
125
|
+
} Color2;
|
126
|
+
|
127
|
+
// Should be replaced by the enum
|
128
|
+
typedef enum ColorEnum {
|
129
|
+
RED,
|
130
|
+
GREEN,
|
131
|
+
BLUE
|
132
|
+
} Color;
|
133
|
+
enum ColorEnum colorInstance = GREEN;
|
134
|
+
`;
|
135
|
+
|
136
|
+
const files: TestFile[] = [
|
137
|
+
{ name: "bad1.c", code: failingCode1 },
|
138
|
+
{ name: "bad2.c", code: failingCode2 },
|
139
|
+
{ name: "bad3.c", code: failingCode3 },
|
140
|
+
{ name: "bad4.c", code: failingCode4 },
|
141
|
+
{ name: "good.c", code: passingCode }
|
142
|
+
];
|
143
|
+
|
144
|
+
describe("Rule 2.3", () => {
|
145
|
+
registerSourceCode(files);
|
146
|
+
|
147
|
+
it("should detect errors in bad.c", () => {
|
148
|
+
expect(countMISRAErrors()).toBe(15);
|
149
|
+
|
150
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad1.c"}).first()!)).toBe(3);
|
151
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad2.c"}).first()!)).toBe(4);
|
152
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad3.c"}).first()!)).toBe(4);
|
153
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "bad4.c"}).first()!)).toBe(4);
|
154
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
|
155
|
+
});
|
156
|
+
|
157
|
+
it("should correct errors in bad.c", () => {
|
158
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
159
|
+
|
160
|
+
const badFile1 = Query.search(FileJp, {name: "bad1.c"}).first()!;
|
161
|
+
expect(Query.searchFrom(badFile1, TypedefDecl).get().length).toBe(0);
|
162
|
+
|
163
|
+
const badFile2 = Query.search(FileJp, {name: "bad2.c"}).first()!;
|
164
|
+
expect(Query.searchFrom(badFile2, TypedefDecl).get().length).toBe(0);
|
165
|
+
expect(Query.searchFrom(badFile2, RecordJp).get().length).toBe(1);
|
166
|
+
|
167
|
+
const badFile3 = Query.search(FileJp, {name: "bad3.c"}).first()!;
|
168
|
+
expect(Query.searchFrom(badFile3, TypedefDecl).get().length).toBe(0);
|
169
|
+
expect(Query.searchFrom(badFile3, RecordJp).get().length).toBe(1);
|
170
|
+
|
171
|
+
const badFile4 = Query.search(FileJp, {name: "bad4.c"}).first()!;
|
172
|
+
expect(Query.searchFrom(badFile4, TypedefDecl).get().length).toBe(0);
|
173
|
+
expect(Query.searchFrom(badFile4, EnumDecl).get().length).toBe(1);
|
174
|
+
});
|
175
|
+
});
|
@@ -0,0 +1,219 @@
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
2
|
+
import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
|
3
|
+
import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
4
|
+
|
5
|
+
const failingCodeEnum1 = `
|
6
|
+
enum MyEnum {
|
7
|
+
RED, GREEN, BLUE
|
8
|
+
};
|
9
|
+
|
10
|
+
enum EnumForCast1 {
|
11
|
+
RED2, GREEN2, BLUE2
|
12
|
+
};
|
13
|
+
|
14
|
+
enum EnumForCast2 {
|
15
|
+
RED3, GREEN3, BLUE3
|
16
|
+
};
|
17
|
+
|
18
|
+
enum MyEnum2 {
|
19
|
+
RED4, GREEN4, BLUE4
|
20
|
+
};
|
21
|
+
|
22
|
+
enum EnumForPtr {
|
23
|
+
RED5, GREEN5, BLUE5
|
24
|
+
};
|
25
|
+
|
26
|
+
enum EnumForArray {
|
27
|
+
RED6, GREEN6, BLUE6
|
28
|
+
};
|
29
|
+
|
30
|
+
// Non-compliant
|
31
|
+
enum UnusedEnum {
|
32
|
+
RED7, GREEN7, BLUE7
|
33
|
+
};
|
34
|
+
|
35
|
+
void enumAsParam(enum MyEnum color) {
|
36
|
+
int i;
|
37
|
+
if (color == RED) {
|
38
|
+
i = 1;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
enum EnumForCast1 enumAsReturn() {
|
43
|
+
return (enum EnumForCast1) RED2;
|
44
|
+
};
|
45
|
+
|
46
|
+
enum EnumForCast2 enumAsReturn2() {
|
47
|
+
int id = 2;
|
48
|
+
return (enum EnumForCast2) id;
|
49
|
+
};
|
50
|
+
|
51
|
+
enum MyEnum2 color_enum = RED4;
|
52
|
+
|
53
|
+
enum EnumForPtr *colorPtr;
|
54
|
+
|
55
|
+
enum EnumForArray colorArray[3];
|
56
|
+
`;
|
57
|
+
|
58
|
+
const failingCodeEnum2 = `
|
59
|
+
typedef enum {
|
60
|
+
A1,
|
61
|
+
B1,
|
62
|
+
C1
|
63
|
+
} ColorEnum2;
|
64
|
+
ColorEnum2 colorEnum2 = A1;
|
65
|
+
|
66
|
+
typedef enum MyColors {
|
67
|
+
A2,
|
68
|
+
B3,
|
69
|
+
C4
|
70
|
+
} ColorOption;
|
71
|
+
enum MyColors my_color = A2;
|
72
|
+
ColorOption color_option = B3;
|
73
|
+
|
74
|
+
// MyColors2 tag should be removed
|
75
|
+
typedef enum MyColors2 {
|
76
|
+
A5,
|
77
|
+
B6,
|
78
|
+
C7
|
79
|
+
} ColorOption2;
|
80
|
+
ColorOption2 color2 = B6;
|
81
|
+
`;
|
82
|
+
|
83
|
+
const failingCodeStruct1 = `
|
84
|
+
struct MyStruct {
|
85
|
+
int x;
|
86
|
+
float y;
|
87
|
+
};
|
88
|
+
|
89
|
+
struct StructForReturn1 {
|
90
|
+
int x;
|
91
|
+
float y;
|
92
|
+
};
|
93
|
+
|
94
|
+
struct MyStruct2 {
|
95
|
+
int x;
|
96
|
+
float y;
|
97
|
+
};
|
98
|
+
|
99
|
+
struct StructForPtr {
|
100
|
+
int x;
|
101
|
+
float y;
|
102
|
+
};
|
103
|
+
|
104
|
+
struct StructForArray {
|
105
|
+
int x;
|
106
|
+
float y;
|
107
|
+
};
|
108
|
+
|
109
|
+
// Non-compliant: should be removed
|
110
|
+
struct UnusedStruct {
|
111
|
+
int x;
|
112
|
+
float y;
|
113
|
+
};
|
114
|
+
|
115
|
+
void structAsParam(struct MyStruct s) {
|
116
|
+
int xField = s.x;
|
117
|
+
}
|
118
|
+
|
119
|
+
struct StructForReturn1 structAsReturn() {
|
120
|
+
return (struct StructForReturn1){1, 1.5f};
|
121
|
+
}
|
122
|
+
|
123
|
+
struct MyStruct2 myStruct = {10, 20.5f};
|
124
|
+
struct StructForPtr *structPtr;
|
125
|
+
struct StructForArray structArray[3];
|
126
|
+
`;
|
127
|
+
|
128
|
+
const failingCodeStruct2 = `
|
129
|
+
typedef struct {
|
130
|
+
int x;
|
131
|
+
float y;
|
132
|
+
} ColorStruct;
|
133
|
+
ColorStruct colorStruct = {1, 2.5};
|
134
|
+
|
135
|
+
typedef struct MyStruct5 {
|
136
|
+
int x;
|
137
|
+
float y;
|
138
|
+
} ColorStruct2;
|
139
|
+
struct MyStruct5 struct5 = {2, 4.5};
|
140
|
+
ColorStruct2 colorStruct2 = {1, 2.5};
|
141
|
+
|
142
|
+
// Violation: MyStruct3 tag will be removed
|
143
|
+
typedef struct MyStruct3 {
|
144
|
+
int x;
|
145
|
+
float y;
|
146
|
+
} ColorStruct3;
|
147
|
+
ColorStruct3 colorStruct3 = {10, 5.5};
|
148
|
+
`;
|
149
|
+
|
150
|
+
const failingCodeUnion1 = `
|
151
|
+
union MyUnion {
|
152
|
+
int x;
|
153
|
+
float y;
|
154
|
+
};
|
155
|
+
|
156
|
+
union UnionForReturn1 {
|
157
|
+
int x;
|
158
|
+
float y;
|
159
|
+
};
|
160
|
+
|
161
|
+
union MyUnion2 {
|
162
|
+
int x;
|
163
|
+
float y;
|
164
|
+
};
|
165
|
+
|
166
|
+
union UnionForPtr {
|
167
|
+
int x;
|
168
|
+
float y;
|
169
|
+
};
|
170
|
+
|
171
|
+
union UnionForArray {
|
172
|
+
int x;
|
173
|
+
float y;
|
174
|
+
};
|
175
|
+
|
176
|
+
// Non-compliant: should be removed
|
177
|
+
union UnusedUnion {
|
178
|
+
int x;
|
179
|
+
float y;
|
180
|
+
};
|
181
|
+
|
182
|
+
void unionAsParam(union MyUnion u) {
|
183
|
+
int xField = u.x;
|
184
|
+
}
|
185
|
+
|
186
|
+
union UnionForReturn1 unionAsReturn() {
|
187
|
+
return (union UnionForReturn1){.x = 1};
|
188
|
+
}
|
189
|
+
|
190
|
+
union MyUnion2 myUnion = {.y = 20.5f};
|
191
|
+
union UnionForPtr *unionPtr;
|
192
|
+
union UnionForArray unionArray[3];
|
193
|
+
`;
|
194
|
+
|
195
|
+
const files: TestFile[] = [
|
196
|
+
{ name: "testEnum1.c", code: failingCodeEnum1 },
|
197
|
+
{ name: "testEnum2.c", code: failingCodeEnum2 },
|
198
|
+
{ name: "testStruct1.c", code: failingCodeStruct1 },
|
199
|
+
{ name: "testStruct2.c", code: failingCodeStruct2 },
|
200
|
+
{ name: "testUnion1.c", code: failingCodeUnion1 },
|
201
|
+
];
|
202
|
+
|
203
|
+
describe("Rule 2.4", () => {
|
204
|
+
registerSourceCode(files);
|
205
|
+
|
206
|
+
it("should detect errors in bad.c", () => {
|
207
|
+
expect(countMISRAErrors()).toBe(5);
|
208
|
+
|
209
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "testEnum1.c"}).first()!)).toBe(1);
|
210
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "testEnum2.c"}).first()!)).toBe(1);
|
211
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "testStruct1.c"}).first()!)).toBe(1);
|
212
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "testStruct2.c"}).first()!)).toBe(1);
|
213
|
+
expect(countMISRAErrors(Query.search(FileJp, {name: "testUnion1.c"}).first()!)).toBe(1);
|
214
|
+
});
|
215
|
+
|
216
|
+
it("should correct errors in bad.c", () => {
|
217
|
+
expect(countErrorsAfterCorrection()).toBe(0);
|
218
|
+
});
|
219
|
+
});
|