From 75eefec60b02012658d76738d610edc886a76d30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 13 Jun 2025 13:07:11 +0200 Subject: [PATCH 1/3] Fix #13933 (Misra C 2025: Add classifications) --- lib/checkers.cpp | 863 ++++++++++++++++++++++++++++++++++++++---- tools/get_checkers.py | 558 ++++++--------------------- 2 files changed, 900 insertions(+), 521 deletions(-) diff --git a/lib/checkers.cpp b/lib/checkers.cpp index f79be438e3b..bc951c53c0b 100644 --- a/lib/checkers.cpp +++ b/lib/checkers.cpp @@ -87,6 +87,8 @@ namespace checkers { {"CheckOther::clarifyStatement","warning"}, {"CheckOther::checkSuspiciousSemicolon","warning,inconclusive"}, {"CheckOther::warningOldStylePointerCast","style,c++"}, + {"CheckOther::warningDangerousTypeCast","warning,c++"}, + {"CheckOther::warningIntToPointerCast","portability"}, {"CheckOther::suspiciousFloatingPointCast","style"}, {"CheckOther::invalidPointerCast","portability"}, {"CheckOther::checkRedundantAssignment","style"}, @@ -359,6 +361,7 @@ namespace checkers { {"Cert C: CON41-C",""}, {"Cert C: DCL03-C",""}, {"Cert C: DCL04-C",""}, + {"Cert C: DCL20-C",""}, {"Cert C: DCL31-C",""}, {"Cert C: DCL36-C",""}, {"Cert C: DCL37-C",""}, @@ -380,7 +383,9 @@ namespace checkers { {"Cert C: EXP13-C",""}, {"Cert C: EXP15-C",""}, {"Cert C: EXP19-C",""}, + {"Cert C: EXP20-C",""}, {"Cert C: EXP32-C",""}, + {"Cert C: EXP34-C",""}, {"Cert C: EXP35-C",""}, {"Cert C: EXP36-C",""}, {"Cert C: EXP37-C",""}, @@ -402,6 +407,7 @@ namespace checkers { {"Cert C: FLP30-C",""}, {"Cert C: FLP36-C","portability"}, {"Cert C: FLP37-C",""}, + {"Cert C: INT17-C",""}, {"Cert C: INT30-C",""}, {"Cert C: INT31-C",""}, {"Cert C: INT32-C",""}, @@ -771,6 +777,7 @@ namespace checkers { {"Misra C++ 2023: 9.6.2",""}, {"Misra C++ 2023: 9.6.3",""}, {"Misra C++ 2023: 9.6.4",""}, + {"Misra C: 1.2",""}, {"Misra C: 1.4",""}, {"Misra C: 1.5",""}, {"Misra C: 10.1",""}, @@ -783,12 +790,19 @@ namespace checkers { {"Misra C: 10.8",""}, {"Misra C: 11.1",""}, {"Misra C: 11.10",""}, + {"Misra C: 11.11",""}, {"Misra C: 11.2",""}, {"Misra C: 11.3",""}, {"Misra C: 11.4",""}, + {"Misra C: 11.5",""}, + {"Misra C: 11.6",""}, + {"Misra C: 11.7",""}, {"Misra C: 11.8",""}, + {"Misra C: 11.9",""}, + {"Misra C: 12.1",""}, {"Misra C: 12.2",""}, {"Misra C: 12.3",""}, + {"Misra C: 12.4",""}, {"Misra C: 12.6",""}, {"Misra C: 13.1",""}, {"Misra C: 13.2",""}, @@ -796,8 +810,24 @@ namespace checkers { {"Misra C: 13.4",""}, {"Misra C: 13.5",""}, {"Misra C: 13.6",""}, + {"Misra C: 14.1",""}, + {"Misra C: 14.2",""}, + {"Misra C: 14.4",""}, + {"Misra C: 15.1",""}, + {"Misra C: 15.2",""}, + {"Misra C: 15.3",""}, + {"Misra C: 15.4",""}, {"Misra C: 15.5",""}, + {"Misra C: 15.6",""}, + {"Misra C: 15.7",""}, + {"Misra C: 16.1",""}, + {"Misra C: 16.2",""}, {"Misra C: 16.3",""}, + {"Misra C: 16.4",""}, + {"Misra C: 16.5",""}, + {"Misra C: 16.6",""}, + {"Misra C: 16.7",""}, + {"Misra C: 17.1",""}, {"Misra C: 17.10",""}, {"Misra C: 17.11",""}, {"Misra C: 17.12",""}, @@ -805,23 +835,58 @@ namespace checkers { {"Misra C: 17.2",""}, {"Misra C: 17.3",""}, {"Misra C: 17.4",""}, + {"Misra C: 17.6",""}, + {"Misra C: 17.7",""}, + {"Misra C: 17.8",""}, {"Misra C: 17.9",""}, {"Misra C: 18.10",""}, + {"Misra C: 18.4",""}, {"Misra C: 18.5",""}, + {"Misra C: 18.7",""}, {"Misra C: 18.8",""}, {"Misra C: 18.9",""}, + {"Misra C: 19.2",""}, + {"Misra C: 19.3",""}, + {"Misra C: 2.2",""}, + {"Misra C: 2.7",""}, + {"Misra C: 20.1",""}, + {"Misra C: 20.10",""}, + {"Misra C: 20.11",""}, + {"Misra C: 20.12",""}, + {"Misra C: 20.13",""}, + {"Misra C: 20.14",""}, + {"Misra C: 20.15",""}, + {"Misra C: 20.2",""}, {"Misra C: 20.3",""}, + {"Misra C: 20.4",""}, + {"Misra C: 20.5",""}, {"Misra C: 20.7",""}, + {"Misra C: 20.8",""}, + {"Misra C: 20.9",""}, {"Misra C: 21.1",""}, + {"Misra C: 21.10",""}, + {"Misra C: 21.11",""}, {"Misra C: 21.12",""}, + {"Misra C: 21.14",""}, + {"Misra C: 21.15",""}, {"Misra C: 21.16",""}, + {"Misra C: 21.19",""}, {"Misra C: 21.2",""}, {"Misra C: 21.20",""}, + {"Misra C: 21.21",""}, {"Misra C: 21.22",""}, {"Misra C: 21.23",""}, {"Misra C: 21.24",""}, {"Misra C: 21.25","warning"}, {"Misra C: 21.26","warning"}, + {"Misra C: 21.3",""}, + {"Misra C: 21.4",""}, + {"Misra C: 21.5",""}, + {"Misra C: 21.6",""}, + {"Misra C: 21.7",""}, + {"Misra C: 21.8",""}, + {"Misra C: 21.9",""}, + {"Misra C: 22.10",""}, {"Misra C: 22.11",""}, {"Misra C: 22.12",""}, {"Misra C: 22.13",""}, @@ -832,6 +897,10 @@ namespace checkers { {"Misra C: 22.18","warning"}, {"Misra C: 22.19","warning"}, {"Misra C: 22.20",""}, + {"Misra C: 22.5",""}, + {"Misra C: 22.7",""}, + {"Misra C: 22.8",""}, + {"Misra C: 22.9",""}, {"Misra C: 23.1",""}, {"Misra C: 23.2",""}, {"Misra C: 23.3",""}, @@ -840,26 +909,51 @@ namespace checkers { {"Misra C: 23.6",""}, {"Misra C: 23.7",""}, {"Misra C: 23.8",""}, + {"Misra C: 3.1",""}, + {"Misra C: 3.2",""}, + {"Misra C: 4.1",""}, + {"Misra C: 4.2",""}, {"Misra C: 5.1",""}, + {"Misra C: 5.10",""}, {"Misra C: 5.2",""}, + {"Misra C: 5.4",""}, + {"Misra C: 5.5",""}, + {"Misra C: 5.6",""}, + {"Misra C: 5.8",""}, + {"Misra C: 5.9",""}, {"Misra C: 6.1",""}, + {"Misra C: 6.2",""}, {"Misra C: 6.3",""}, + {"Misra C: 7.1",""}, + {"Misra C: 7.2",""}, + {"Misra C: 7.3",""}, {"Misra C: 7.4","style"}, {"Misra C: 7.5",""}, {"Misra C: 7.6",""}, {"Misra C: 8.1",""}, {"Misra C: 8.10",""}, - {"Misra C: 8.15",""}, + {"Misra C: 8.11",""}, + {"Misra C: 8.12",""}, + {"Misra C: 8.14",""}, {"Misra C: 8.15",""}, {"Misra C: 8.16",""}, {"Misra C: 8.17",""}, + {"Misra C: 8.18",""}, + {"Misra C: 8.2",""}, {"Misra C: 8.3",""}, {"Misra C: 8.4",""}, + {"Misra C: 8.5",""}, {"Misra C: 8.6",""}, {"Misra C: 8.7",""}, {"Misra C: 8.8",""}, + {"Misra C: 8.9",""}, + {"Misra C: 9.2",""}, + {"Misra C: 9.3",""}, + {"Misra C: 9.4",""}, + {"Misra C: 9.5",""}, {"Misra C: 9.6",""}, {"Misra C: 9.7",""}, + {"Misra C: Dir 1.2",""}, {"Misra C: Dir 4.12",""}, {"Misra C: Dir 4.3",""}, {"Misra C: Dir 4.4",""}, @@ -868,7 +962,6 @@ namespace checkers { {"Misra C: Dir 4.9",""}, {"PremiumCheckBufferOverrun::addressOfPointerArithmetic","warning"}, {"PremiumCheckBufferOverrun::negativeBufferSizeCheckedNonZero","warning"}, - {"PremiumCheckBufferOverrun::negativeBufferSizeCheckedNonZero","warning"}, {"PremiumCheckHang::infiniteLoop",""}, {"PremiumCheckHang::infiniteLoopContinue",""}, {"PremiumCheckOther::arrayPointerComparison","style"}, @@ -883,16 +976,24 @@ namespace checkers { {"PremiumCheckUninitVar::uninitmember",""}, {"PremiumCheckUninitVar::uninitvar",""}, {"PremiumCheckUnusedVar::unreadVariable","style"}, - {"PremiumCheckUnusedVar::unusedPrivateMember","style"} + {"PremiumCheckUnusedVar::unusedPrivateMember","style"}, + {"PremiumMetrics::HIS::Call",""}, + {"PremiumMetrics::HIS::Calling",""}, + {"PremiumMetrics::HIS::Goto",""}, + {"PremiumMetrics::HIS::Level",""}, + {"PremiumMetrics::HIS::Param",""}, + {"PremiumMetrics::HIS::Path",""}, + {"PremiumMetrics::HIS::Stmt",""}, + {"PremiumMetrics::HIS::return",""}, + {"PremiumMetrics::cyclomaticComplexity",""} }; const char Req[] = "Required"; const char Adv[] = "Advisory"; const char Man[] = "Mandatory"; const char Doc[] = "Document"; - - const std::vector misraC2012Directives = - { + const char Dis[] = "Disapplied"; + const std::vector misraC2012Directives{ {1,1,Req,0}, {2,1,Req,0}, {3,1,Req,0}, @@ -915,13 +1016,11 @@ namespace checkers { {5,2,Req,4}, {5,3,Req,4}, }; - - const std::vector misraC2012Rules = - { + const std::vector misraC2012Rules{ {1,1,Req,0}, {1,2,Adv,0}, {1,3,Req,0}, - {1,4,Req,2}, // amendment 2 + {1,4,Req,2}, // Amendment 2 {1,5,Req,3}, // Amendment 3 {2,1,Req,0}, {2,2,Req,0}, @@ -999,14 +1098,14 @@ namespace checkers { {12,2,Req,0}, {12,3,Adv,0}, {12,4,Adv,0}, - {12,5,Man,1}, // amendment 1 - {12,6,Req,4}, // amendment 4 + {12,5,Man,1}, // Amendment 1 + {12,6,Req,4}, // Amendment 4 {13,1,Req,0}, {13,2,Req,0}, {13,3,Adv,0}, {13,4,Adv,0}, {13,5,Req,0}, - {13,6,Man,0}, + {13,6,Req,0}, {14,1,Req,0}, {14,2,Req,0}, {14,3,Req,0}, @@ -1029,7 +1128,7 @@ namespace checkers { {17,2,Req,0}, {17,3,Man,0}, {17,4,Man,0}, - {17,5,Adv,0}, + {17,5,Req,0}, {17,6,Man,0}, {17,7,Req,0}, {17,8,Adv,0}, @@ -1074,13 +1173,13 @@ namespace checkers { {21,8,Req,0}, {21,9,Req,0}, {21,10,Req,0}, - {21,11,Req,0}, - {21,12,Adv,0}, + {21,11,Adv,0}, + {21,12,Req,0}, {21,13,Man,1}, // Amendment 1 {21,14,Req,1}, // Amendment 1 {21,15,Req,1}, // Amendment 1 {21,16,Req,1}, // Amendment 1 - {21,17,Req,1}, // Amendment 1 + {21,17,Man,1}, // Amendment 1 {21,18,Man,1}, // Amendment 1 {21,19,Man,1}, // Amendment 1 {21,20,Man,1}, // Amendment 1 @@ -1103,7 +1202,7 @@ namespace checkers { {22,11,Req,4}, // Amendment 4 {22,12,Man,4}, // Amendment 4 {22,13,Req,4}, // Amendment 4 - {22,14,Man,4}, // Amendment 4 + {22,14,Req,4}, // Amendment 4 {22,15,Req,4}, // Amendment 4 {22,16,Req,4}, // Amendment 4 {22,17,Req,4}, // Amendment 4 @@ -1119,37 +1218,457 @@ namespace checkers { {23,7,Adv,3}, // Amendment 3 {23,8,Req,3}, // Amendment 3 }; - - const std::map misraRuleSeverity{ - {"1.1", "error"}, //{"syntaxError", "unknownMacro"}}, - {"1.3", "error"}, //most "error" - {"2.1", "style"}, //{"alwaysFalse", "duplicateBreak"}}, - {"2.2", "style"}, //{"alwaysTrue", "redundantCondition", "redundantAssignment", "redundantAssignInSwitch", "unreadVariable"}}, - {"2.6", "style"}, //{"unusedLabel"}}, - {"2.8", "style"}, //{"unusedVariable"}}, - {"5.3", "style"}, //{"shadowVariable"}}, - {"8.3", "style"}, //{"funcArgNamesDifferent"}}, // inconclusive - {"8.13", "style"}, //{"constPointer"}}, - {"9.1", "error"}, //{"uninitvar"}}, - {"14.3", "style"}, //{"alwaysTrue", "alwaysFalse", "compareValueOutOfTypeRangeError", "knownConditionTrueFalse"}}, - {"13.2", "error"}, //{"unknownEvaluationOrder"}}, - {"13.6", "style"}, //{"sizeofCalculation"}}, - {"17.4", "error"}, //{"missingReturn"}}, - {"17.5", "warning"}, //{"argumentSize"}}, - {"18.1", "error"}, //{"pointerOutOfBounds"}}, - {"18.2", "error"}, //{"comparePointers"}}, - {"18.3", "error"}, //{"comparePointers"}}, - {"18.6", "error"}, //{"danglingLifetime"}}, - {"19.1", "error"}, //{"overlappingWriteUnion", "overlappingWriteFunction"}}, - {"20.6", "error"}, //{"preprocessorErrorDirective"}}, - {"21.13", "error"}, //{"invalidFunctionArg"}}, - {"21.17", "error"}, //{"bufferAccessOutOfBounds"}}, - {"21.18", "error"}, //{"bufferAccessOutOfBounds"}}, - {"22.1", "error"}, //{"memleak", "resourceLeak", "memleakOnRealloc", "leakReturnValNotUsed", "leakNoVarFunctionCall"}}, - {"22.2", "error"}, //{"autovarInvalidDeallocation"}}, - {"22.3", "error"}, //{"incompatibleFileOpen"}}, - {"22.4", "error"}, //{"writeReadOnlyFile"}}, - {"22.6", "error"}, //{"useClosedFile"}} + const std::vector misraC2023Directives{ + {1,1,Req,0}, + {2,1,Req,0}, + {3,1,Req,0}, + {4,1,Req,0}, + {4,2,Adv,0}, + {4,3,Req,0}, + {4,4,Adv,0}, + {4,5,Adv,0}, + {4,6,Adv,0}, + {4,7,Req,0}, + {4,8,Adv,0}, + {4,9,Adv,0}, + {4,10,Req,0}, + {4,11,Req,0}, + {4,12,Req,0}, + {4,13,Adv,0}, + {4,14,Req,0}, + {4,15,Req,0}, + {5,1,Req,0}, + {5,2,Req,0}, + {5,3,Req,0}, + }; + const std::vector misraC2023Rules{ + {1,1,Req,0}, + {1,2,Adv,0}, + {1,3,Req,0}, + {1,4,Req,0}, + {1,5,Req,0}, + {2,1,Req,0}, + {2,2,Req,0}, + {2,3,Adv,0}, + {2,4,Adv,0}, + {2,5,Adv,0}, + {2,6,Adv,0}, + {2,7,Adv,0}, + {2,8,Adv,0}, + {3,1,Req,0}, + {3,2,Req,0}, + {4,1,Req,0}, + {4,2,Adv,0}, + {5,1,Req,0}, + {5,2,Req,0}, + {5,3,Req,0}, + {5,4,Req,0}, + {5,5,Req,0}, + {5,6,Req,0}, + {5,7,Req,0}, + {5,8,Req,0}, + {5,9,Adv,0}, + {6,1,Req,0}, + {6,2,Req,0}, + {6,3,Req,0}, + {7,1,Req,0}, + {7,2,Req,0}, + {7,3,Req,0}, + {7,4,Req,0}, + {7,5,Man,0}, + {7,6,Req,0}, + {8,1,Req,0}, + {8,2,Req,0}, + {8,3,Req,0}, + {8,4,Req,0}, + {8,5,Req,0}, + {8,6,Req,0}, + {8,7,Adv,0}, + {8,8,Req,0}, + {8,9,Adv,0}, + {8,10,Req,0}, + {8,11,Adv,0}, + {8,12,Req,0}, + {8,13,Adv,0}, + {8,14,Req,0}, + {8,15,Req,0}, + {8,16,Adv,0}, + {8,17,Adv,0}, + {9,1,Man,0}, + {9,2,Req,0}, + {9,3,Req,0}, + {9,4,Req,0}, + {9,5,Req,0}, + {9,6,Req,0}, + {9,7,Man,0}, + {10,1,Req,0}, + {10,2,Req,0}, + {10,3,Req,0}, + {10,4,Req,0}, + {10,5,Adv,0}, + {10,6,Req,0}, + {10,7,Req,0}, + {10,8,Req,0}, + {11,1,Req,0}, + {11,2,Req,0}, + {11,3,Req,0}, + {11,4,Adv,0}, + {11,5,Adv,0}, + {11,6,Req,0}, + {11,7,Req,0}, + {11,8,Req,0}, + {11,9,Req,0}, + {11,10,Req,0}, + {12,1,Adv,0}, + {12,2,Req,0}, + {12,3,Adv,0}, + {12,4,Adv,0}, + {12,5,Man,0}, + {12,6,Req,0}, + {13,1,Req,0}, + {13,2,Req,0}, + {13,3,Adv,0}, + {13,4,Adv,0}, + {13,5,Req,0}, + {13,6,Req,0}, + {14,1,Req,0}, + {14,2,Req,0}, + {14,3,Req,0}, + {14,4,Req,0}, + {15,1,Adv,0}, + {15,2,Req,0}, + {15,3,Req,0}, + {15,4,Adv,0}, + {15,5,Adv,0}, + {15,6,Req,0}, + {15,7,Req,0}, + {16,1,Req,0}, + {16,2,Req,0}, + {16,3,Req,0}, + {16,4,Req,0}, + {16,5,Req,0}, + {16,6,Req,0}, + {16,7,Req,0}, + {17,1,Req,0}, + {17,2,Req,0}, + {17,3,Man,0}, + {17,4,Man,0}, + {17,5,Req,0}, + {17,6,Man,0}, + {17,7,Req,0}, + {17,8,Adv,0}, + {17,9,Man,0}, + {17,10,Req,0}, + {17,11,Adv,0}, + {17,12,Adv,0}, + {17,13,Req,0}, + {18,1,Req,0}, + {18,2,Req,0}, + {18,3,Req,0}, + {18,4,Adv,0}, + {18,5,Adv,0}, + {18,6,Req,0}, + {18,7,Req,0}, + {18,8,Req,0}, + {18,9,Req,0}, + {18,10,Man,0}, + {19,1,Man,0}, + {19,2,Adv,0}, + {20,1,Adv,0}, + {20,2,Req,0}, + {20,3,Req,0}, + {20,4,Req,0}, + {20,5,Adv,0}, + {20,6,Req,0}, + {20,7,Req,0}, + {20,8,Req,0}, + {20,9,Req,0}, + {20,10,Adv,0}, + {20,11,Req,0}, + {20,12,Req,0}, + {20,13,Req,0}, + {20,14,Req,0}, + {21,1,Req,0}, + {21,2,Req,0}, + {21,3,Req,0}, + {21,4,Req,0}, + {21,5,Req,0}, + {21,6,Req,0}, + {21,7,Req,0}, + {21,8,Req,0}, + {21,9,Req,0}, + {21,10,Req,0}, + {21,11,Adv,0}, + {21,12,Req,0}, + {21,13,Man,0}, + {21,14,Req,0}, + {21,15,Req,0}, + {21,16,Req,0}, + {21,17,Man,0}, + {21,18,Man,0}, + {21,19,Man,0}, + {21,20,Man,0}, + {21,21,Req,0}, + {21,22,Man,0}, + {21,23,Req,0}, + {21,24,Req,0}, + {21,25,Req,0}, + {21,26,Req,0}, + {22,1,Req,0}, + {22,2,Man,0}, + {22,3,Req,0}, + {22,4,Man,0}, + {22,5,Man,0}, + {22,6,Man,0}, + {22,7,Req,0}, + {22,8,Req,0}, + {22,9,Req,0}, + {22,10,Req,0}, + {22,11,Req,0}, + {22,12,Man,0}, + {22,13,Req,0}, + {22,14,Man,0}, + {22,15,Req,0}, + {22,16,Req,0}, + {22,17,Req,0}, + {22,18,Req,0}, + {22,19,Req,0}, + {22,20,Man,0}, + {23,1,Adv,0}, + {23,2,Req,0}, + {23,3,Adv,0}, + {23,4,Req,0}, + {23,5,Adv,0}, + {23,6,Req,0}, + {23,7,Adv,0}, + {23,8,Req,0}, + }; + const std::vector misraC2025Directives{ + {1,1,Req,0}, + {1,2,Adv,0}, + {2,1,Req,0}, + {3,1,Req,0}, + {4,1,Req,0}, + {4,2,Adv,0}, + {4,3,Req,0}, + {4,4,Adv,0}, + {4,5,Adv,0}, + {4,6,Adv,0}, + {4,7,Req,0}, + {4,8,Adv,0}, + {4,9,Adv,0}, + {4,10,Req,0}, + {4,11,Req,0}, + {4,12,Req,0}, + {4,13,Adv,0}, + {4,14,Req,0}, + {4,15,Req,0}, + {5,1,Req,0}, + {5,2,Req,0}, + {5,3,Req,0}, + }; + const std::vector misraC2025Rules{ + {1,1,Req,0}, + {1,3,Req,0}, + {1,4,Req,0}, + {1,5,Req,0}, + {2,1,Req,0}, + {2,2,Req,0}, + {2,3,Adv,0}, + {2,4,Adv,0}, + {2,5,Adv,0}, + {2,6,Adv,0}, + {2,7,Adv,0}, + {2,8,Adv,0}, + {3,1,Req,0}, + {3,2,Req,0}, + {4,1,Req,0}, + {4,2,Adv,0}, + {5,1,Req,0}, + {5,2,Req,0}, + {5,3,Req,0}, + {5,4,Req,0}, + {5,5,Req,0}, + {5,6,Req,0}, + {5,7,Req,0}, + {5,8,Req,0}, + {5,9,Adv,0}, + {5,10,Req,0}, + {6,1,Req,0}, + {6,2,Req,0}, + {6,3,Req,0}, + {7,1,Req,0}, + {7,2,Req,0}, + {7,3,Req,0}, + {7,4,Req,0}, + {7,5,Man,0}, + {7,6,Req,0}, + {8,1,Req,0}, + {8,2,Req,0}, + {8,3,Req,0}, + {8,4,Req,0}, + {8,5,Req,0}, + {8,6,Req,0}, + {8,7,Adv,0}, + {8,8,Req,0}, + {8,9,Adv,0}, + {8,10,Req,0}, + {8,11,Adv,0}, + {8,12,Req,0}, + {8,13,Adv,0}, + {8,14,Req,0}, + {8,15,Req,0}, + {8,16,Adv,0}, + {8,17,Adv,0}, + {8,18,Req,0}, + {8,19,Adv,0}, + {9,1,Man,0}, + {9,2,Req,0}, + {9,3,Req,0}, + {9,4,Req,0}, + {9,5,Req,0}, + {9,6,Req,0}, + {9,7,Man,0}, + {10,1,Req,0}, + {10,2,Req,0}, + {10,3,Req,0}, + {10,4,Req,0}, + {10,5,Adv,0}, + {10,6,Req,0}, + {10,7,Req,0}, + {10,8,Req,0}, + {11,1,Req,0}, + {11,2,Req,0}, + {11,3,Req,0}, + {11,4,Req,0}, + {11,5,Adv,0}, + {11,6,Req,0}, + {11,8,Req,0}, + {11,9,Req,0}, + {11,10,Req,0}, + {11,11,Req,0}, + {12,1,Adv,0}, + {12,2,Req,0}, + {12,3,Adv,0}, + {12,4,Adv,0}, + {12,5,Man,0}, + {12,6,Req,0}, + {13,1,Req,0}, + {13,2,Req,0}, + {13,3,Adv,0}, + {13,4,Adv,0}, + {13,5,Req,0}, + {13,6,Req,0}, + {14,1,Req,0}, + {14,2,Req,0}, + {14,3,Req,0}, + {14,4,Req,0}, + {15,1,Adv,0}, + {15,2,Req,0}, + {15,3,Req,0}, + {15,4,Adv,0}, + {15,5,Dis,0}, + {15,6,Req,0}, + {15,7,Req,0}, + {16,1,Req,0}, + {16,2,Req,0}, + {16,3,Req,0}, + {16,4,Req,0}, + {16,5,Req,0}, + {16,6,Req,0}, + {16,7,Req,0}, + {17,1,Req,0}, + {17,2,Req,0}, + {17,3,Man,0}, + {17,4,Man,0}, + {17,5,Req,0}, + {17,7,Req,0}, + {17,8,Adv,0}, + {17,9,Man,0}, + {17,10,Req,0}, + {17,11,Adv,0}, + {17,12,Adv,0}, + {17,13,Req,0}, + {18,1,Req,0}, + {18,2,Req,0}, + {18,3,Req,0}, + {18,4,Adv,0}, + {18,5,Adv,0}, + {18,6,Req,0}, + {18,7,Req,0}, + {18,8,Req,0}, + {18,9,Req,0}, + {18,10,Man,0}, + {19,1,Man,0}, + {19,2,Adv,0}, + {19,3,Req,0}, + {20,1,Adv,0}, + {20,2,Req,0}, + {20,3,Req,0}, + {20,4,Req,0}, + {20,5,Adv,0}, + {20,6,Req,0}, + {20,7,Req,0}, + {20,8,Req,0}, + {20,9,Req,0}, + {20,10,Adv,0}, + {20,11,Req,0}, + {20,12,Req,0}, + {20,13,Req,0}, + {20,14,Req,0}, + {20,15,Req,0}, + {21,3,Req,0}, + {21,4,Req,0}, + {21,5,Req,0}, + {21,6,Req,0}, + {21,7,Req,0}, + {21,8,Req,0}, + {21,9,Req,0}, + {21,10,Req,0}, + {21,11,Adv,0}, + {21,12,Req,0}, + {21,13,Man,0}, + {21,14,Req,0}, + {21,15,Req,0}, + {21,16,Req,0}, + {21,17,Man,0}, + {21,18,Man,0}, + {21,19,Man,0}, + {21,20,Man,0}, + {21,21,Req,0}, + {21,22,Man,0}, + {21,23,Req,0}, + {21,24,Req,0}, + {21,25,Req,0}, + {21,26,Req,0}, + {22,1,Req,0}, + {22,2,Man,0}, + {22,3,Req,0}, + {22,4,Man,0}, + {22,5,Man,0}, + {22,6,Man,0}, + {22,7,Req,0}, + {22,8,Req,0}, + {22,9,Req,0}, + {22,10,Req,0}, + {22,11,Req,0}, + {22,12,Man,0}, + {22,13,Req,0}, + {22,14,Man,0}, + {22,15,Req,0}, + {22,16,Req,0}, + {22,17,Req,0}, + {22,18,Req,0}, + {22,19,Req,0}, + {22,20,Man,0}, + {23,1,Adv,0}, + {23,2,Req,0}, + {23,3,Adv,0}, + {23,4,Req,0}, + {23,5,Adv,0}, + {23,6,Req,0}, + {23,7,Adv,0}, + {23,8,Req,0}, }; const std::vector misraCpp2008Rules = @@ -1931,7 +2450,7 @@ std::vector checkers::autosarInfo{ std::vector checkers::certCInfo{ {"PRE30-C", "L3"}, - {"PRE31-C", "L3"}, + {"PRE31-C", "L2"}, {"PRE32-C", "L3"}, {"DCL30-C", "L2"}, {"DCL31-C", "L3"}, @@ -1940,24 +2459,25 @@ std::vector checkers::certCInfo{ {"DCL38-C", "L3"}, {"DCL39-C", "L3"}, {"DCL40-C", "L3"}, - {"DCL41-C", "L3"}, + {"DCL41-C", "L2"}, {"EXP30-C", "L2"}, {"EXP32-C", "L2"}, {"EXP33-C", "L1"}, {"EXP34-C", "L1"}, - {"EXP35-C", "L3"}, + {"EXP35-C", "L2"}, {"EXP36-C", "L3"}, {"EXP37-C", "L3"}, - {"EXP39-C", "L3"}, + {"EXP39-C", "L2"}, {"EXP40-C", "L3"}, - {"EXP42-C", "L2"}, + {"EXP42-C", "L1"}, {"EXP43-C", "L3"}, {"EXP44-C", "L3"}, {"EXP45-C", "L2"}, {"EXP46-C", "L2"}, + {"EXP47-C", "L2"}, {"INT30-C", "L2"}, - {"INT31-C", "L2"}, - {"INT32-C", "L2"}, + {"INT31-C", "L1"}, + {"INT32-C", "L1"}, {"INT33-C", "L2"}, {"INT34-C", "L3"}, {"INT35-C", "L3"}, @@ -1969,20 +2489,20 @@ std::vector checkers::certCInfo{ {"FLP37-C", "L3"}, {"ARR30-C", "L2"}, {"ARR32-C", "L2"}, - {"ARR36-C", "L2"}, + {"ARR36-C", "L3"}, {"ARR37-C", "L2"}, - {"ARR38-C", "L1"}, + {"ARR38-C", "L2"}, {"ARR39-C", "L2"}, {"STR30-C", "L2"}, - {"STR31-C", "L1"}, + {"STR31-C", "L2"}, {"STR32-C", "L1"}, {"STR34-C", "L2"}, {"STR37-C", "L3"}, {"STR38-C", "L1"}, - {"MEM30-C", "L1"}, - {"MEM31-C", "L2"}, + {"MEM30-C", "L2"}, + {"MEM31-C", "L3"}, {"MEM33-C", "L3"}, - {"MEM34-C", "L1"}, + {"MEM34-C", "L2"}, {"MEM35-C", "L2"}, {"MEM36-C", "L3"}, {"FIO30-C", "L1"}, @@ -1991,7 +2511,7 @@ std::vector checkers::certCInfo{ {"FIO37-C", "L1"}, {"FIO38-C", "L3"}, {"FIO39-C", "L2"}, - {"FIO40-C", "L3"}, + {"FIO40-C", "L2"}, {"FIO41-C", "L3"}, {"FIO42-C", "L3"}, {"FIO44-C", "L3"}, @@ -2004,31 +2524,225 @@ std::vector checkers::certCInfo{ {"ENV33-C", "L1"}, {"ENV34-C", "L3"}, {"SIG30-C", "L1"}, - {"SIG31-C", "L2"}, + {"SIG31-C", "L1"}, {"SIG34-C", "L3"}, {"SIG35-C", "L3"}, - {"ERR30-C", "L2"}, + {"ERR30-C", "L1"}, {"ERR32-C", "L3"}, {"ERR33-C", "L1"}, + {"ERR34-C", "L2"}, {"CON30-C", "L3"}, {"CON31-C", "L3"}, - {"CON32-C", "L2"}, + {"CON32-C", "L3"}, {"CON33-C", "L3"}, {"CON34-C", "L3"}, {"CON35-C", "L3"}, {"CON36-C", "L3"}, - {"CON37-C", "L2"}, + {"CON37-C", "L3"}, {"CON38-C", "L3"}, - {"CON39-C", "L2"}, + {"CON39-C", "L3"}, {"CON40-C", "L2"}, {"CON41-C", "L3"}, - {"MSC30-C", "L2"}, + {"CON43-C", "L3"}, + {"MSC30-C", "L3"}, {"MSC32-C", "L1"}, - {"MSC33-C", "L1"}, + {"MSC33-C", "L2"}, {"MSC37-C", "L2"}, {"MSC38-C", "L3"}, {"MSC39-C", "L3"}, {"MSC40-C", "L3"}, + {"MSC41-C", "L2"}, + {"POS30-C", "L1"}, + {"POS34-C", "L2"}, + {"POS35-C", "L2"}, + {"POS36-C", "L1"}, + {"POS37-C", "L1"}, + {"POS38-C", "L3"}, + {"POS39-C", "L1"}, + {"POS44-C", "L3"}, + {"POS47-C", "L3"}, + {"POS48-C", "L3"}, + {"POS49-C", "L3"}, + {"POS50-C", "L3"}, + {"POS51-C", "L3"}, + {"POS52-C", "L3"}, + {"POS53-C", "L2"}, + {"POS54-C", "L1"}, + {"WIN30-C", "L3"}, + // Recommendations + {"PRE00-C", "L3"}, + {"PRE01-C", "L1"}, + {"PRE02-C", "L1"}, + {"PRE04-C", "L3"}, + {"PRE05-C", "L3"}, + {"PRE06-C", "L3"}, + {"PRE07-C", "L3"}, + {"PRE08-C", "L3"}, + {"PRE09-C", "L1"}, + {"PRE10-C", "L1"}, + {"PRE11-C", "L2"}, + {"PRE12-C", "L3"}, + {"PRE13-C", "L3"}, + {"DCL00-C", "L3"}, + {"DCL01-C", "L3"}, + {"DCL02-C", "L3"}, + {"DCL03-C", "L3"}, + {"DCL04-C", "L3"}, + {"DCL05-C", "L3"}, + {"DCL06-C", "L3"}, + {"DCL07-C", "L3"}, + {"DCL08-C", "L3"}, + {"DCL09-C", "L3"}, + {"DCL10-C", "L2"}, + {"DCL11-C", "L1"}, + {"DCL12-C", "L3"}, + {"DCL13-C", "L3"}, + {"DCL15-C", "L3"}, + {"DCL16-C", "L3"}, + {"DCL17-C", "L3"}, + {"DCL18-C", "L3"}, + {"DCL19-C", "L3"}, + {"DCL20-C", "L1"}, + {"DCL21-C", "L3"}, + {"DCL22-C", "L3"}, + {"DCL23-C", "L2"}, + {"EXP00-C", "L2"}, + {"EXP02-C", "L3"}, + {"EXP03-C", "L3"}, + {"EXP05-C", "L3"}, + {"EXP07-C", "L3"}, + {"EXP08-C", "L2"}, + {"EXP09-C", "L2"}, + {"EXP10-C", "L2"}, + {"EXP11-C", "L3"}, + {"EXP12-C", "L3"}, + {"EXP13-C", "L3"}, + {"EXP14-C", "L3"}, + {"EXP15-C", "L1"}, + {"EXP16-C", "L2"}, + {"EXP19-C", "L1"}, + {"EXP20-C", "L1"}, + {"INT00-C", "L3"}, + {"INT01-C", "L2"}, + {"INT02-C", "L3"}, + {"INT04-C", "L1"}, + {"INT05-C", "L2"}, + {"INT07-C", "L1"}, + {"INT08-C", "L3"}, + {"INT09-C", "L3"}, + {"INT10-C", "L3"}, + {"INT12-C", "L3"}, + {"INT13-C", "L2"}, + {"INT14-C", "L3"}, + {"INT15-C", "L2"}, + {"INT16-C", "L3"}, + {"INT17-C", "L3"}, + {"INT18-C", "L1"}, + {"FLP00-C", "L3"}, + {"FLP01-C", "L3"}, + {"FLP02-C", "L3"}, + {"FLP03-C", "L3"}, + {"FLP04-C", "L3"}, + {"FLP05-C", "L3"}, + {"FLP06-C", "L3"}, + {"FLP07-C", "L3"}, + {"ARR00-C", "L2"}, + {"ARR01-C", "L1"}, + {"ARR02-C", "L2"}, + {"STR00-C", "L3"}, + {"STR01-C", "L3"}, + {"STR02-C", "L2"}, + {"STR03-C", "L3"}, + {"STR04-C", "L3"}, + {"STR05-C", "L3"}, + {"STR06-C", "L2"}, + {"STR07-C", "L1"}, + {"STR08-C", "L2"}, + {"STR09-C", "L3"}, + {"STR10-C", "L3"}, + {"STR11-C", "L2"}, + {"FIO01-C", "L1"}, + {"FIO02-C", "L3"}, + {"FIO03-C", "L3"}, + {"FIO05-C", "L3"}, + {"FIO06-C", "L3"}, + {"FIO08-C", "L3"}, + {"FIO09-C", "L3"}, + {"FIO10-C", "L3"}, + {"FIO11-C", "L3"}, + {"FIO13-C", "L3"}, + {"FIO14-C", "L3"}, + {"FIO15-C", "L3"}, + {"FIO17-C", "L2"}, + {"FIO18-C", "L3"}, + {"FIO19-C", "L3"}, + {"FIO20-C", "L1"}, + {"FIO21-C", "L3"}, + {"FIO22-C", "L3"}, + {"FIO23-C", "L3"}, + {"FIO24-C", "L3"}, + {"ENV01-C", "L2"}, + {"ENV02-C", "L3"}, + {"ENV03-C", "L2"}, + {"SIG00-C", "L2"}, + {"SIG01-C", "L3"}, + {"SIG02-C", "L2"}, + {"ERR00-C", "L3"}, + {"ERR01-C", "L2"}, + {"ERR02-C", "L3"}, + {"ERR03-C", "L3"}, + {"ERR04-C", "L3"}, + {"ERR05-C", "L2"}, + {"ERR06-C", "L3"}, + {"ERR07-C", "L1"}, + {"API00-C", "L3"}, + {"API01-C", "L1"}, + {"API02-C", "L1"}, + {"API03-C", "L3"}, + {"API04-C", "L3"}, + {"API05-C", "L1"}, + {"API07-C", "L3"}, + {"API09-C", "L3"}, + {"API10-C", "L3"}, + {"CON01-C", "L3"}, + {"CON02-C", "L3"}, + {"CON04-C", "L3"}, + {"CON05-C", "L3"}, + {"CON06-C", "L3"}, + {"CON07-C", "L2"}, + {"CON08-C", "L3"}, + {"CON09-C", "L3"}, + {"MSC00-C", "L3"}, + {"MSC01-C", "L3"}, + {"MSC04-C", "L3"}, + {"MSC05-C", "L3"}, + {"MSC06-C", "L1"}, + {"MSC07-C", "L3"}, + {"MSC09-C", "L3"}, + {"MSC10-C", "L3"}, + {"MSC11-C", "L3"}, + {"MSC12-C", "L3"}, + {"MSC13-C", "L3"}, + {"MSC14-C", "L3"}, + {"MSC15-C", "L2"}, + {"MSC17-C", "L1"}, + {"MSC18-C", "L3"}, + {"MSC19-C", "L3"}, + {"MSC20-C", "L2"}, + {"MSC21-C", "L3"}, + {"MSC22-C", "L3"}, + {"MSC23-C", "L3"}, + {"MSC24-C", "L1"}, + {"MSC25-C", "L3"}, + {"POS01-C", "L2"}, + {"POS02-C", "L2"}, + {"POS04-C", "L3"}, + {"POS05-C", "L3"}, + {"WIN00-C", "L2"}, + {"WIN01-C", "L1"}, + {"WIN02-C", "L1"}, + {"WIN03-C", "L3"}, + {"WIN04-C", "L3"}, }; std::vector checkers::certCppInfo{ @@ -2039,8 +2753,8 @@ std::vector checkers::certCppInfo{ {"DCL54-CPP", "L2"}, {"DCL55-CPP", "L3"}, {"DCL56-CPP", "L3"}, - {"DCL57-CPP", "L3"}, - {"DCL58-CPP", "L3"}, + {"DCL57-CPP", "L2"}, + {"DCL58-CPP", "L2"}, {"DCL59-CPP", "L3"}, {"DCL60-CPP", "L3"}, {"EXP50-CPP", "L2"}, @@ -2112,9 +2826,8 @@ std::vector checkers::certCppInfo{ {"CON56-CPP", "L3"}, {"MSC50-CPP", "L2"}, {"MSC51-CPP", "L1"}, - {"MSC52-CPP", "L3"}, - {"MSC53-CPP", "L2"}, + {"MSC52-CPP", "L2"}, + {"MSC53-CPP", "L3"}, {"MSC54-CPP", "L2"}, }; - diff --git a/tools/get_checkers.py b/tools/get_checkers.py index a75535af0e2..1428b6d702d 100644 --- a/tools/get_checkers.py +++ b/tools/get_checkers.py @@ -2,6 +2,7 @@ import glob import os import re +import requests print("""/* * Cppcheck - A tool for static C/C++ code analysis @@ -51,7 +52,9 @@ req = line[line.find('//')+2:].strip() else: req = '' - premium_checkers.append(' {"%s","%s"}' % (res.group(1), req)) + c = ' {"%s","%s"}' % (res.group(1), req) + if c not in premium_checkers: + premium_checkers.append(c) print(',\n'.join(sorted(premium_checkers))) print(' };') @@ -61,268 +64,79 @@ const char Adv[] = "Advisory"; const char Man[] = "Mandatory"; const char Doc[] = "Document"; + const char Dis[] = "Disapplied";""") - const std::vector misraC2012Directives = - { - {1,1,Req,0}, - {2,1,Req,0}, - {3,1,Req,0}, - {4,1,Req,0}, - {4,2,Adv,0}, - {4,3,Req,0}, - {4,4,Adv,0}, - {4,5,Adv,0}, - {4,6,Adv,3}, - {4,7,Req,0}, - {4,8,Adv,0}, - {4,9,Adv,3}, - {4,10,Req,0}, - {4,11,Req,3}, - {4,12,Req,0}, - {4,13,Adv,0}, - {4,14,Req,2}, - {4,15,Req,3}, - {5,1,Req,4}, - {5,2,Req,4}, - {5,3,Req,4}, - }; +for version in (2012, 2023, 2025): + with open(os.path.expanduser('~/cppchecksolutions/addon/coverage/misra-c-%i.txt' % version), 'rt') as f: + all_guidelines = f.read() - const std::vector misraC2012Rules = - { - {1,1,Req,0}, - {1,2,Adv,0}, - {1,3,Req,0}, - {1,4,Req,2}, // amendment 2 - {1,5,Req,3}, // Amendment 3 - {2,1,Req,0}, - {2,2,Req,0}, - {2,3,Adv,0}, - {2,4,Adv,0}, - {2,5,Adv,0}, - {2,6,Adv,0}, - {2,7,Adv,0}, - {2,8,Adv,0}, - {3,1,Req,0}, - {3,2,Req,0}, - {4,1,Req,0}, - {4,2,Adv,0}, - {5,1,Req,0}, - {5,2,Req,0}, - {5,3,Req,0}, - {5,4,Req,0}, - {5,5,Req,0}, - {5,6,Req,0}, - {5,7,Req,0}, - {5,8,Req,0}, - {5,9,Adv,0}, - {6,1,Req,0}, - {6,2,Req,0}, - {6,3,Req,0}, - {7,1,Req,0}, - {7,2,Req,0}, - {7,3,Req,0}, - {7,4,Req,0}, - {7,5,Man,0}, - {7,6,Req,0}, - {8,1,Req,0}, - {8,2,Req,0}, - {8,3,Req,0}, - {8,4,Req,0}, - {8,5,Req,0}, - {8,6,Req,0}, - {8,7,Adv,0}, - {8,8,Req,0}, - {8,9,Adv,0}, - {8,10,Req,0}, - {8,11,Adv,0}, - {8,12,Req,0}, - {8,13,Adv,0}, - {8,14,Req,0}, - {8,15,Req,0}, - {8,16,Adv,0}, - {8,17,Adv,0}, - {9,1,Man,0}, - {9,2,Req,0}, - {9,3,Req,0}, - {9,4,Req,0}, - {9,5,Req,0}, - {9,6,Req,0}, - {9,7,Man,0}, - {10,1,Req,0}, - {10,2,Req,0}, - {10,3,Req,0}, - {10,4,Req,0}, - {10,5,Adv,0}, - {10,6,Req,0}, - {10,7,Req,0}, - {10,8,Req,0}, - {11,1,Req,0}, - {11,2,Req,0}, - {11,3,Req,0}, - {11,4,Adv,0}, - {11,5,Adv,0}, - {11,6,Req,0}, - {11,7,Req,0}, - {11,8,Req,0}, - {11,9,Req,0}, - {11,10,Req,0}, - {12,1,Adv,0}, - {12,2,Req,0}, - {12,3,Adv,0}, - {12,4,Adv,0}, - {12,5,Man,1}, // amendment 1 - {12,6,Req,4}, // amendment 4 - {13,1,Req,0}, - {13,2,Req,0}, - {13,3,Adv,0}, - {13,4,Adv,0}, - {13,5,Req,0}, - {13,6,Man,0}, - {14,1,Req,0}, - {14,2,Req,0}, - {14,3,Req,0}, - {14,4,Req,0}, - {15,1,Adv,0}, - {15,2,Req,0}, - {15,3,Req,0}, - {15,4,Adv,0}, - {15,5,Adv,0}, - {15,6,Req,0}, - {15,7,Req,0}, - {16,1,Req,0}, - {16,2,Req,0}, - {16,3,Req,0}, - {16,4,Req,0}, - {16,5,Req,0}, - {16,6,Req,0}, - {16,7,Req,0}, - {17,1,Req,0}, - {17,2,Req,0}, - {17,3,Man,0}, - {17,4,Man,0}, - {17,5,Adv,0}, - {17,6,Man,0}, - {17,7,Req,0}, - {17,8,Adv,0}, - {17,9,Man,0}, - {17,10,Req,0}, - {17,11,Adv,0}, - {17,12,Adv,0}, - {17,13,Req,0}, - {18,1,Req,0}, - {18,2,Req,0}, - {18,3,Req,0}, - {18,4,Adv,0}, - {18,5,Adv,0}, - {18,6,Req,0}, - {18,7,Req,0}, - {18,8,Req,0}, - {18,9,Req,0}, - {18,10,Man,0}, - {19,1,Man,0}, - {19,2,Adv,0}, - {20,1,Adv,0}, - {20,2,Req,0}, - {20,3,Req,0}, - {20,4,Req,0}, - {20,5,Adv,0}, - {20,6,Req,0}, - {20,7,Req,0}, - {20,8,Req,0}, - {20,9,Req,0}, - {20,10,Adv,0}, - {20,11,Req,0}, - {20,12,Req,0}, - {20,13,Req,0}, - {20,14,Req,0}, - {21,1,Req,0}, - {21,2,Req,0}, - {21,3,Req,0}, - {21,4,Req,0}, - {21,5,Req,0}, - {21,6,Req,0}, - {21,7,Req,0}, - {21,8,Req,0}, - {21,9,Req,0}, - {21,10,Req,0}, - {21,11,Req,0}, - {21,12,Adv,0}, - {21,13,Man,1}, // Amendment 1 - {21,14,Req,1}, // Amendment 1 - {21,15,Req,1}, // Amendment 1 - {21,16,Req,1}, // Amendment 1 - {21,17,Req,1}, // Amendment 1 - {21,18,Man,1}, // Amendment 1 - {21,19,Man,1}, // Amendment 1 - {21,20,Man,1}, // Amendment 1 - {21,21,Req,3}, // Amendment 3 - {21,22,Man,3}, // Amendment 3 - {21,23,Req,3}, // Amendment 3 - {21,24,Req,3}, // Amendment 3 - {21,25,Req,4}, // Amendment 4 - {21,26,Req,4}, // Amendment 4 - {22,1,Req,0}, - {22,2,Man,0}, - {22,3,Req,0}, - {22,4,Man,0}, - {22,5,Man,0}, - {22,6,Man,0}, - {22,7,Req,1}, // Amendment 1 - {22,8,Req,1}, // Amendment 1 - {22,9,Req,1}, // Amendment 1 - {22,10,Req,1}, // Amendment 1 - {22,11,Req,4}, // Amendment 4 - {22,12,Man,4}, // Amendment 4 - {22,13,Req,4}, // Amendment 4 - {22,14,Man,4}, // Amendment 4 - {22,15,Req,4}, // Amendment 4 - {22,16,Req,4}, // Amendment 4 - {22,17,Req,4}, // Amendment 4 - {22,18,Req,4}, // Amendment 4 - {22,19,Req,4}, // Amendment 4 - {22,20,Man,4}, // Amendment 4 - {23,1,Adv,3}, // Amendment 3 - {23,2,Req,3}, // Amendment 3 - {23,3,Adv,3}, // Amendment 3 - {23,4,Req,3}, // Amendment 3 - {23,5,Adv,3}, // Amendment 3 - {23,6,Req,3}, // Amendment 3 - {23,7,Adv,3}, // Amendment 3 - {23,8,Req,3}, // Amendment 3 - }; + if version == 2012: + amd = {'4.6':3,'4.9':3,'4.11':3,'4.14':2,'4.15':3,'5.1':4,'5.2':4,'5.3':4} + else: + amd = {} - const std::map misraRuleSeverity{ - {"1.1", "error"}, //{"syntaxError", "unknownMacro"}}, - {"1.3", "error"}, //most "error" - {"2.1", "style"}, //{"alwaysFalse", "duplicateBreak"}}, - {"2.2", "style"}, //{"alwaysTrue", "redundantCondition", "redundantAssignment", "redundantAssignInSwitch", "unreadVariable"}}, - {"2.6", "style"}, //{"unusedLabel"}}, - {"2.8", "style"}, //{"unusedVariable"}}, - {"5.3", "style"}, //{"shadowVariable"}}, - {"8.3", "style"}, //{"funcArgNamesDifferent"}}, // inconclusive - {"8.13", "style"}, //{"constPointer"}}, - {"9.1", "error"}, //{"uninitvar"}}, - {"14.3", "style"}, //{"alwaysTrue", "alwaysFalse", "compareValueOutOfTypeRangeError", "knownConditionTrueFalse"}}, - {"13.2", "error"}, //{"unknownEvaluationOrder"}}, - {"13.6", "style"}, //{"sizeofCalculation"}}, - {"17.4", "error"}, //{"missingReturn"}}, - {"17.5", "warning"}, //{"argumentSize"}}, - {"18.1", "error"}, //{"pointerOutOfBounds"}}, - {"18.2", "error"}, //{"comparePointers"}}, - {"18.3", "error"}, //{"comparePointers"}}, - {"18.6", "error"}, //{"danglingLifetime"}}, - {"19.1", "error"}, //{"overlappingWriteUnion", "overlappingWriteFunction"}}, - {"20.6", "error"}, //{"preprocessorErrorDirective"}}, - {"21.13", "error"}, //{"invalidFunctionArg"}}, - {"21.17", "error"}, //{"bufferAccessOutOfBounds"}}, - {"21.18", "error"}, //{"bufferAccessOutOfBounds"}}, - {"22.1", "error"}, //{"memleak", "resourceLeak", "memleakOnRealloc", "leakReturnValNotUsed", "leakNoVarFunctionCall"}}, - {"22.2", "error"}, //{"autovarInvalidDeallocation"}}, - {"22.3", "error"}, //{"incompatibleFileOpen"}}, - {"22.4", "error"}, //{"writeReadOnlyFile"}}, - {"22.6", "error"}, //{"useClosedFile"}} - }; + print(' const std::vector misraC%iDirectives{' % version) + for line in all_guidelines.split('\n'): + res = re.match(r'Dir\s+(\d+)[.](\d+)\s+(\w+).*', line) + if res: + a = amd.get('%s.%s' % (res.group(1), res.group(2)), 0) + print(' {%s,%s,%s,%i},' % (res.group(1), res.group(2), res.group(3)[:3], a)) + print(' };') + + if version == 2012: + amd = {'1.4':2, + '1.5':3, + '12.5':1, + '12.6':4, + '21.13':1, + '21.14':1, + '21.15':1, + '21.16':1, + '21.17':1, + '21.18':1, + '21.19':1, + '21.20':1, + '21.21':3, + '21.22':3, + '21.23':3, + '21.24':3, + '21.25':4, + '21.26':4, + '22.7':1, + '22.8':1, + '22.9':1, + '22.10':1, + '22.11':4, + '22.12':4, + '22.13':4, + '22.14':4, + '22.15':4, + '22.16':4, + '22.17':4, + '22.18':4, + '22.19':4, + '22.20':4, + '23.1':3, + '23.2':3, + '23.3':3, + '23.4':3, + '23.5':3, + '23.6':3, + '23.7':3, + '23.8':3 } + else: + amd = {} + print(' const std::vector misraC%iRules{' % version) + for line in all_guidelines.split('\n'): + res = re.match(r'Rule\s+(\d+)[.](\d+)\s+(\w+).*', line) + if res: + a = amd.get('%s.%s' % (res.group(1), res.group(2)), 0) + comment = '' if a == 0 else ' // Amendment %i' % a + print(' {%s,%s,%s,%i},%s' % (res.group(1), res.group(2), res.group(3)[:3], a, comment)) + print(' };') + +print(""" const std::vector misraCpp2008Rules = { {0,1,1,Req}, @@ -1099,195 +913,47 @@ {"a27-0-2", checkers::Adv}, {"a27-0-3", checkers::Req}, }; +""") -std::vector checkers::certCInfo{ - {"PRE30-C", "L3"}, - {"PRE31-C", "L3"}, - {"PRE32-C", "L3"}, - {"DCL30-C", "L2"}, - {"DCL31-C", "L3"}, - {"DCL36-C", "L2"}, - {"DCL37-C", "L3"}, - {"DCL38-C", "L3"}, - {"DCL39-C", "L3"}, - {"DCL40-C", "L3"}, - {"DCL41-C", "L3"}, - {"EXP30-C", "L2"}, - {"EXP32-C", "L2"}, - {"EXP33-C", "L1"}, - {"EXP34-C", "L1"}, - {"EXP35-C", "L3"}, - {"EXP36-C", "L3"}, - {"EXP37-C", "L3"}, - {"EXP39-C", "L3"}, - {"EXP40-C", "L3"}, - {"EXP42-C", "L2"}, - {"EXP43-C", "L3"}, - {"EXP44-C", "L3"}, - {"EXP45-C", "L2"}, - {"EXP46-C", "L2"}, - {"INT30-C", "L2"}, - {"INT31-C", "L2"}, - {"INT32-C", "L2"}, - {"INT33-C", "L2"}, - {"INT34-C", "L3"}, - {"INT35-C", "L3"}, - {"INT36-C", "L3"}, - {"FLP30-C", "L2"}, - {"FLP32-C", "L2"}, - {"FLP34-C", "L3"}, - {"FLP36-C", "L3"}, - {"FLP37-C", "L3"}, - {"ARR30-C", "L2"}, - {"ARR32-C", "L2"}, - {"ARR36-C", "L2"}, - {"ARR37-C", "L2"}, - {"ARR38-C", "L1"}, - {"ARR39-C", "L2"}, - {"STR30-C", "L2"}, - {"STR31-C", "L1"}, - {"STR32-C", "L1"}, - {"STR34-C", "L2"}, - {"STR37-C", "L3"}, - {"STR38-C", "L1"}, - {"MEM30-C", "L1"}, - {"MEM31-C", "L2"}, - {"MEM33-C", "L3"}, - {"MEM34-C", "L1"}, - {"MEM35-C", "L2"}, - {"MEM36-C", "L3"}, - {"FIO30-C", "L1"}, - {"FIO32-C", "L3"}, - {"FIO34-C", "L1"}, - {"FIO37-C", "L1"}, - {"FIO38-C", "L3"}, - {"FIO39-C", "L2"}, - {"FIO40-C", "L3"}, - {"FIO41-C", "L3"}, - {"FIO42-C", "L3"}, - {"FIO44-C", "L3"}, - {"FIO45-C", "L2"}, - {"FIO46-C", "L3"}, - {"FIO47-C", "L2"}, - {"ENV30-C", "L3"}, - {"ENV31-C", "L3"}, - {"ENV32-C", "L1"}, - {"ENV33-C", "L1"}, - {"ENV34-C", "L3"}, - {"SIG30-C", "L1"}, - {"SIG31-C", "L2"}, - {"SIG34-C", "L3"}, - {"SIG35-C", "L3"}, - {"ERR30-C", "L2"}, - {"ERR32-C", "L3"}, - {"ERR33-C", "L1"}, - {"CON30-C", "L3"}, - {"CON31-C", "L3"}, - {"CON32-C", "L2"}, - {"CON33-C", "L3"}, - {"CON34-C", "L3"}, - {"CON35-C", "L3"}, - {"CON36-C", "L3"}, - {"CON37-C", "L2"}, - {"CON38-C", "L3"}, - {"CON39-C", "L2"}, - {"CON40-C", "L2"}, - {"CON41-C", "L3"}, - {"MSC30-C", "L2"}, - {"MSC32-C", "L1"}, - {"MSC33-C", "L1"}, - {"MSC37-C", "L2"}, - {"MSC38-C", "L3"}, - {"MSC39-C", "L3"}, - {"MSC40-C", "L3"}, -}; -std::vector checkers::certCppInfo{ - {"DCL50-CPP", "L1"}, - {"DCL51-CPP", "L3"}, - {"DCL52-CPP", "L3"}, - {"DCL53-CPP", "L3"}, - {"DCL54-CPP", "L2"}, - {"DCL55-CPP", "L3"}, - {"DCL56-CPP", "L3"}, - {"DCL57-CPP", "L3"}, - {"DCL58-CPP", "L3"}, - {"DCL59-CPP", "L3"}, - {"DCL60-CPP", "L3"}, - {"EXP50-CPP", "L2"}, - {"EXP51-CPP", "L3"}, - {"EXP52-CPP", "L3"}, - {"EXP53-CPP", "L1"}, - {"EXP54-CPP", "L2"}, - {"EXP55-CPP", "L2"}, - {"EXP56-CPP", "L3"}, - {"EXP57-CPP", "L3"}, - {"EXP58-CPP", "L3"}, - {"EXP59-CPP", "L3"}, - {"EXP60-CPP", "L1"}, - {"EXP61-CPP", "L2"}, - {"EXP62-CPP", "L2"}, - {"EXP63-CPP", "L2"}, - {"INT50-CPP", "L3"}, - {"CTR50-CPP", "L2"}, - {"CTR51-CPP", "L2"}, - {"CTR52-CPP", "L1"}, - {"CTR53-CPP", "L2"}, - {"CTR54-CPP", "L2"}, - {"CTR55-CPP", "L1"}, - {"CTR56-CPP", "L2"}, - {"CTR57-CPP", "L3"}, - {"CTR58-CPP", "L3"}, - {"STR50-CPP", "L1"}, - {"STR51-CPP", "L1"}, - {"STR52-CPP", "L2"}, - {"STR53-CPP", "L2"}, - {"MEM50-CPP", "L1"}, - {"MEM51-CPP", "L1"}, - {"MEM52-CPP", "L1"}, - {"MEM53-CPP", "L1"}, - {"MEM54-CPP", "L1"}, - {"MEM55-CPP", "L1"}, - {"MEM56-CPP", "L1"}, - {"MEM57-CPP", "L2"}, - {"FIO50-CPP", "L2"}, - {"FIO51-CPP", "L3"}, - {"ERR50-CPP", "L3"}, - {"ERR51-CPP", "L3"}, - {"ERR52-CPP", "L3"}, - {"ERR53-CPP", "L3"}, - {"ERR54-CPP", "L1"}, - {"ERR55-CPP", "L2"}, - {"ERR56-CPP", "L2"}, - {"ERR57-CPP", "L3"}, - {"ERR58-CPP", "L2"}, - {"ERR59-CPP", "L1"}, - {"ERR60-CPP", "L3"}, - {"ERR61-CPP", "L3"}, - {"ERR62-CPP", "L3"}, - {"OOP50-CPP", "L3"}, - {"OOP51-CPP", "L3"}, - {"OOP52-CPP", "L2"}, - {"OOP53-CPP", "L3"}, - {"OOP54-CPP", "L3"}, - {"OOP55-CPP", "L2"}, - {"OOP56-CPP", "L3"}, - {"OOP57-CPP", "L2"}, - {"OOP58-CPP", "L2"}, - {"CON50-CPP", "L3"}, - {"CON51-CPP", "L2"}, - {"CON52-CPP", "L2"}, - {"CON53-CPP", "L3"}, - {"CON54-CPP", "L3"}, - {"CON55-CPP", "L3"}, - {"CON56-CPP", "L3"}, - {"MSC50-CPP", "L2"}, - {"MSC51-CPP", "L1"}, - {"MSC52-CPP", "L3"}, - {"MSC53-CPP", "L2"}, - {"MSC54-CPP", "L2"}, -}; +def getCertCInfo(main_url:str): + """Fetches CERT C rules information.""" + # Fetching the CERT C rules page + r = requests.get(main_url) + mainpage = r.text + for line in mainpage.split('\n'): + res = re.search(r'(Rule|Rec.) \d\d[.] [A-Za-z ]+ [(][A-Z][A-Z][A-Z][)]', line) + if res is None: + continue + r = requests.get('https://wiki.sei.cmu.edu' + res.group(1)) + text = r.text.replace('\n', '').replace('', '\n').replace('', '\n') + rules = [] + for line in text.split('\n'): + if not line.startswith(']+>([A-Z][A-Z][A-Z][0-9][0-9]-CP*)<.*>(L[1-3])<.+', line) + if res: + if res.group(1) == 'EXP40-C' and 'EXP39-C' not in rules: + print(' {"EXP39-C", "L2"},') + print(' {"%s", "%s"},' % (res.group(1), res.group(2))) + rules.append(res.group(1)) + if 'EXP45-C' in rules: + if 'EXP46-C' not in rules: + print(' {"EXP46-C", "L2"},') + if 'EXP47-C' not in rules: + print(' {"EXP47-C", "L2"},') -""") + +print('std::vector checkers::certCInfo{') +getCertCInfo('https://wiki.sei.cmu.edu/confluence/display/c/2+Rules') +print(' // Recommendations') +getCertCInfo('https://wiki.sei.cmu.edu/confluence/display/c/3+Recommendations') +print('};') +print('') +print('std::vector checkers::certCppInfo{') +getCertCInfo('https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682') +print('};') +print('') From 5aa2521a0e9bb3620b1f4935ccdd11a7efa63da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 13 Jun 2025 15:49:30 +0200 Subject: [PATCH 2/3] checkers.h --- lib/checkers.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/checkers.h b/lib/checkers.h index b87971a514e..c9cd5cccf3e 100644 --- a/lib/checkers.h +++ b/lib/checkers.h @@ -61,11 +61,13 @@ namespace checkers { extern CPPCHECKLIB const std::vector misraC2012Directives; extern CPPCHECKLIB const std::vector misraC2012Rules; + extern CPPCHECKLIB const std::vector misraC2023Directives; + extern CPPCHECKLIB const std::vector misraC2023Rules; + extern CPPCHECKLIB const std::vector misraC2025Directives; + extern CPPCHECKLIB const std::vector misraC2025Rules; extern CPPCHECKLIB const std::vector misraCpp2008Rules; extern CPPCHECKLIB const std::vector misraCpp2023Rules; - extern CPPCHECKLIB const std::map misraRuleSeverity; - struct CPPCHECKLIB IdMapping { const char* guideline; const char* cppcheckId; From bd428d205b3c37827d51d0ca977181b39bc84f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 13 Jun 2025 15:51:02 +0200 Subject: [PATCH 3/3] pylint --- tools/get_checkers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/get_checkers.py b/tools/get_checkers.py index 1428b6d702d..4d5c708ea68 100644 --- a/tools/get_checkers.py +++ b/tools/get_checkers.py @@ -919,13 +919,13 @@ def getCertCInfo(main_url:str): """Fetches CERT C rules information.""" # Fetching the CERT C rules page - r = requests.get(main_url) + r = requests.get(main_url, timeout=30) mainpage = r.text for line in mainpage.split('\n'): res = re.search(r'(Rule|Rec.) \d\d[.] [A-Za-z ]+ [(][A-Z][A-Z][A-Z][)]', line) if res is None: continue - r = requests.get('https://wiki.sei.cmu.edu' + res.group(1)) + r = requests.get('https://wiki.sei.cmu.edu' + res.group(1), timeout=30) text = r.text.replace('\n', '').replace('', '\n').replace('', '\n') rules = [] for line in text.split('\n'):