diff --git a/lib/checkers.cpp b/lib/checkers.cpp index bc951c53c0b..e8c57d4c467 100644 --- a/lib/checkers.cpp +++ b/lib/checkers.cpp @@ -23,6 +23,8 @@ namespace checkers { const std::map allCheckers{ + {"Check64BitPortability::pointerassignment","portability"}, + {"CheckAssert::assertWithSideEffects","warning"}, {"CheckBool::checkIncrementBoolean","style"}, {"CheckBool::checkBitwiseOnBoolean","style,inconclusive"}, {"CheckBool::checkComparisonOfBoolWithInt","warning,c++"}, @@ -33,6 +35,31 @@ namespace checkers { {"CheckBool::pointerArithBool",""}, {"CheckBool::checkAssignBoolToFloat","style,c++"}, {"CheckBool::returnValueOfFunctionReturningBool","style"}, + {"CheckExceptionSafety::destructors","warning"}, + {"CheckExceptionSafety::deallocThrow","warning"}, + {"CheckExceptionSafety::checkRethrowCopy","style"}, + {"CheckExceptionSafety::checkCatchExceptionByValue","style"}, + {"CheckExceptionSafety::nothrowThrows",""}, + {"CheckExceptionSafety::unhandledExceptionSpecification","style,inconclusive"}, + {"CheckExceptionSafety::rethrowNoCurrentException",""}, + {"CheckFunctions::checkProhibitedFunctions",""}, + {"CheckFunctions::invalidFunctionUsage",""}, + {"CheckFunctions::checkIgnoredReturnValue","style,warning"}, + {"CheckFunctions::checkMissingReturn",""}, + {"CheckFunctions::checkMathFunctions","style,warning,c99,c++11"}, + {"CheckFunctions::memsetZeroBytes","warning"}, + {"CheckFunctions::memsetInvalid2ndParam","warning,portability"}, + {"CheckFunctions::returnLocalStdMove","performance,c++11"}, + {"CheckFunctions::useStandardLibrary","style"}, + {"CheckIO::checkCoutCerrMisusage","c"}, + {"CheckIO::checkFileUsage",""}, + {"CheckIO::invalidScanf",""}, + {"CheckIO::checkWrongPrintfScanfArguments",""}, + {"CheckMemoryLeakInFunction::checkReallocUsage",""}, + {"CheckMemoryLeakInClass::check",""}, + {"CheckMemoryLeakStructMember::check",""}, + {"CheckMemoryLeakNoVar::check",""}, + {"CheckMemoryLeakNoVar::checkForUnsafeArgAlloc",""}, {"CheckPostfixOperator::postfixOperator","performance"}, {"CheckSizeof::checkSizeofForNumericParameter","warning"}, {"CheckSizeof::checkSizeofForArrayParameter","warning"}, @@ -42,34 +69,19 @@ namespace checkers { {"CheckSizeof::sizeofFunction","warning"}, {"CheckSizeof::suspiciousSizeofCalculation","warning,inconclusive"}, {"CheckSizeof::sizeofVoid","portability"}, - {"Check64BitPortability::pointerassignment","portability"}, - {"CheckStl::outOfBounds",""}, - {"CheckStl::outOfBoundsIndexExpression",""}, - {"CheckStl::iterators",""}, - {"CheckStl::misMatchingContainers",""}, - {"CheckStl::misMatchingContainerIterator",""}, - {"CheckStl::invalidContainer",""}, - {"CheckStl::stlOutOfBounds",""}, - {"CheckStl::negativeIndex",""}, - {"CheckStl::erase",""}, - {"CheckStl::stlBoundaries",""}, - {"CheckStl::if_find","warning,performance"}, - {"CheckStl::checkFindInsert","performance"}, - {"CheckStl::size","performance,c++03"}, - {"CheckStl::redundantCondition","style"}, - {"CheckStl::missingComparison","warning"}, - {"CheckStl::string_c_str",""}, - {"CheckStl::uselessCalls","performance,warning"}, - {"CheckStl::checkDereferenceInvalidIterator","warning"}, - {"CheckStl::checkDereferenceInvalidIterator2",""}, - {"CheckStl::useStlAlgorithm","style"}, - {"CheckStl::knownEmptyContainer","style"}, - {"CheckStl::eraseIteratorOutOfBounds",""}, - {"CheckStl::checkMutexes","warning"}, - {"CheckNullPointer::nullPointer",""}, - {"CheckNullPointer::nullConstantDereference",""}, - {"CheckNullPointer::arithmetic",""}, - {"CheckNullPointer::analyseWholeProgram","unusedfunctions"}, + {"CheckString::stringLiteralWrite",""}, + {"CheckString::checkAlwaysTrueOrFalseStringCompare","warning"}, + {"CheckString::checkSuspiciousStringCompare","warning"}, + {"CheckString::strPlusChar",""}, + {"CheckString::checkIncorrectStringCompare","warning"}, + {"CheckString::overlappingStrcmp","warning"}, + {"CheckString::sprintfOverlappingData",""}, + {"CheckVaarg::va_start_argument",""}, + {"CheckVaarg::va_list_usage","notclang"}, + {"CheckUnusedFunctions::check","unusedFunction"}, + {"CheckAutoVariables::assignFunctionArg","style,warning"}, + {"CheckAutoVariables::autoVariables",""}, + {"CheckAutoVariables::checkVarLifetime",""}, {"CheckBufferOverrun::arrayIndex",""}, {"CheckBufferOverrun::pointerArithmetic","portability"}, {"CheckBufferOverrun::bufferOverflow",""}, @@ -79,9 +91,26 @@ namespace checkers { {"CheckBufferOverrun::analyseWholeProgram",""}, {"CheckBufferOverrun::objectIndex",""}, {"CheckBufferOverrun::negativeArraySize",""}, - {"CheckUninitVar::check",""}, - {"CheckUninitVar::valueFlowUninit",""}, - {"CheckUninitVar::analyseWholeProgram",""}, + {"CheckCondition::assignIf","style"}, + {"CheckCondition::checkBadBitmaskCheck","style"}, + {"CheckCondition::comparison","style"}, + {"CheckCondition::duplicateCondition","style"}, + {"CheckCondition::multiCondition","style"}, + {"CheckCondition::multiCondition2","warning"}, + {"CheckCondition::checkIncorrectLogicOperator","style,warning"}, + {"CheckCondition::checkModuloAlwaysTrueFalse","warning"}, + {"CheckCondition::clarifyCondition","style"}, + {"CheckCondition::alwaysTrueFalse","style"}, + {"CheckCondition::checkInvalidTestForOverflow","warning"}, + {"CheckCondition::checkPointerAdditionResultNotNull","warning"}, + {"CheckCondition::checkDuplicateConditionalAssign","style"}, + {"CheckCondition::checkAssignmentInCondition","style"}, + {"CheckCondition::checkCompareValueOutOfTypeRange","style,platform"}, + {"CheckLeakAutoVar::check","notclang"}, + {"CheckNullPointer::nullPointer",""}, + {"CheckNullPointer::nullConstantDereference",""}, + {"CheckNullPointer::arithmetic",""}, + {"CheckNullPointer::analyseWholeProgram","unusedfunctions"}, {"CheckOther::checkCastIntToCharAndBack","warning"}, {"CheckOther::clarifyCalculation","style"}, {"CheckOther::clarifyStatement","warning"}, @@ -125,6 +154,37 @@ namespace checkers { {"CheckOther::checkComparePointers",""}, {"CheckOther::checkModuloOfOne","style"}, {"CheckOther::checkOverlappingWrite",""}, + {"CheckStl::outOfBounds",""}, + {"CheckStl::outOfBoundsIndexExpression",""}, + {"CheckStl::iterators",""}, + {"CheckStl::misMatchingContainers",""}, + {"CheckStl::misMatchingContainerIterator",""}, + {"CheckStl::invalidContainer",""}, + {"CheckStl::stlOutOfBounds",""}, + {"CheckStl::negativeIndex",""}, + {"CheckStl::erase",""}, + {"CheckStl::stlBoundaries",""}, + {"CheckStl::if_find","warning,performance"}, + {"CheckStl::checkFindInsert","performance"}, + {"CheckStl::size","performance,c++03"}, + {"CheckStl::redundantCondition","style"}, + {"CheckStl::missingComparison","warning"}, + {"CheckStl::string_c_str",""}, + {"CheckStl::uselessCalls","performance,warning"}, + {"CheckStl::checkDereferenceInvalidIterator","warning"}, + {"CheckStl::checkDereferenceInvalidIterator2",""}, + {"CheckStl::useStlAlgorithm","style"}, + {"CheckStl::knownEmptyContainer","style"}, + {"CheckStl::eraseIteratorOutOfBounds",""}, + {"CheckStl::checkMutexes","warning"}, + {"CheckType::checkTooBigBitwiseShift","platform"}, + {"CheckType::checkIntegerOverflow","platform"}, + {"CheckType::checkSignConversion","warning"}, + {"CheckType::checkLongCast","style"}, + {"CheckType::checkFloatToIntegerOverflow",""}, + {"CheckUninitVar::check",""}, + {"CheckUninitVar::valueFlowUninit",""}, + {"CheckUninitVar::analyseWholeProgram",""}, {"CheckClass::checkConstructors","style,warning"}, {"CheckClass::checkExplicitConstructors","style"}, {"CheckClass::checkCopyConstructors","warning"}, @@ -148,66 +208,6 @@ namespace checkers { {"CheckClass::analyseWholeProgram",""}, {"CheckUnusedVar::checkFunctionVariableUsage","style"}, {"CheckUnusedVar::checkStructMemberUsage","style"}, - {"CheckIO::checkCoutCerrMisusage","c"}, - {"CheckIO::checkFileUsage",""}, - {"CheckIO::invalidScanf",""}, - {"CheckIO::checkWrongPrintfScanfArguments",""}, - {"CheckCondition::assignIf","style"}, - {"CheckCondition::checkBadBitmaskCheck","style"}, - {"CheckCondition::comparison","style"}, - {"CheckCondition::duplicateCondition","style"}, - {"CheckCondition::multiCondition","style"}, - {"CheckCondition::multiCondition2","warning"}, - {"CheckCondition::checkIncorrectLogicOperator","style,warning"}, - {"CheckCondition::checkModuloAlwaysTrueFalse","warning"}, - {"CheckCondition::clarifyCondition","style"}, - {"CheckCondition::alwaysTrueFalse","style"}, - {"CheckCondition::checkInvalidTestForOverflow","warning"}, - {"CheckCondition::checkPointerAdditionResultNotNull","warning"}, - {"CheckCondition::checkDuplicateConditionalAssign","style"}, - {"CheckCondition::checkAssignmentInCondition","style"}, - {"CheckCondition::checkCompareValueOutOfTypeRange","style,platform"}, - {"CheckFunctions::checkProhibitedFunctions",""}, - {"CheckFunctions::invalidFunctionUsage",""}, - {"CheckFunctions::checkIgnoredReturnValue","style,warning"}, - {"CheckFunctions::checkMissingReturn",""}, - {"CheckFunctions::checkMathFunctions","style,warning,c99,c++11"}, - {"CheckFunctions::memsetZeroBytes","warning"}, - {"CheckFunctions::memsetInvalid2ndParam","warning,portability"}, - {"CheckFunctions::returnLocalStdMove","performance,c++11"}, - {"CheckFunctions::useStandardLibrary","style"}, - {"CheckVaarg::va_start_argument",""}, - {"CheckVaarg::va_list_usage","notclang"}, - {"CheckUnusedFunctions::check","unusedFunction"}, - {"CheckType::checkTooBigBitwiseShift","platform"}, - {"CheckType::checkIntegerOverflow","platform"}, - {"CheckType::checkSignConversion","warning"}, - {"CheckType::checkLongCast","style"}, - {"CheckType::checkFloatToIntegerOverflow",""}, - {"CheckString::stringLiteralWrite",""}, - {"CheckString::checkAlwaysTrueOrFalseStringCompare","warning"}, - {"CheckString::checkSuspiciousStringCompare","warning"}, - {"CheckString::strPlusChar",""}, - {"CheckString::checkIncorrectStringCompare","warning"}, - {"CheckString::overlappingStrcmp","warning"}, - {"CheckString::sprintfOverlappingData",""}, - {"CheckAssert::assertWithSideEffects","warning"}, - {"CheckExceptionSafety::destructors","warning"}, - {"CheckExceptionSafety::deallocThrow","warning"}, - {"CheckExceptionSafety::checkRethrowCopy","style"}, - {"CheckExceptionSafety::checkCatchExceptionByValue","style"}, - {"CheckExceptionSafety::nothrowThrows",""}, - {"CheckExceptionSafety::unhandledExceptionSpecification","style,inconclusive"}, - {"CheckExceptionSafety::rethrowNoCurrentException",""}, - {"CheckAutoVariables::assignFunctionArg","style,warning"}, - {"CheckAutoVariables::autoVariables",""}, - {"CheckAutoVariables::checkVarLifetime",""}, - {"CheckLeakAutoVar::check","notclang"}, - {"CheckMemoryLeakInFunction::checkReallocUsage",""}, - {"CheckMemoryLeakInClass::check",""}, - {"CheckMemoryLeakStructMember::check",""}, - {"CheckMemoryLeakNoVar::check",""}, - {"CheckMemoryLeakNoVar::checkForUnsafeArgAlloc",""}, }; const std::map premiumCheckers{ @@ -318,6 +318,7 @@ namespace checkers { {"Cert C++: ERR62-CPP",""}, {"Cert C++: EXP50-CPP",""}, {"Cert C++: EXP51-CPP",""}, + {"Cert C++: EXP54-CPP",""}, {"Cert C++: EXP55-CPP",""}, {"Cert C++: EXP56-CPP",""}, {"Cert C++: EXP57-CPP",""}, @@ -326,6 +327,7 @@ namespace checkers { {"Cert C++: EXP60-CPP",""}, {"Cert C++: FIO51-CPP",""}, {"Cert C++: INT50-CPP",""}, + {"Cert C++: MEM51-CPP",""}, {"Cert C++: MEM52-CPP",""}, {"Cert C++: MEM53-CPP",""}, {"Cert C++: MEM54-CPP",""}, @@ -939,6 +941,7 @@ namespace checkers { {"Misra C: 8.16",""}, {"Misra C: 8.17",""}, {"Misra C: 8.18",""}, + {"Misra C: 8.19",""}, {"Misra C: 8.2",""}, {"Misra C: 8.3",""}, {"Misra C: 8.4",""}, @@ -979,11 +982,14 @@ namespace checkers { {"PremiumCheckUnusedVar::unusedPrivateMember","style"}, {"PremiumMetrics::HIS::Call",""}, {"PremiumMetrics::HIS::Calling",""}, + {"PremiumMetrics::HIS::Comment",""}, {"PremiumMetrics::HIS::Goto",""}, {"PremiumMetrics::HIS::Level",""}, {"PremiumMetrics::HIS::Param",""}, {"PremiumMetrics::HIS::Path",""}, {"PremiumMetrics::HIS::Stmt",""}, + {"PremiumMetrics::HIS::StmtFile",""}, + {"PremiumMetrics::HIS::VOCF",""}, {"PremiumMetrics::HIS::return",""}, {"PremiumMetrics::cyclomaticComplexity",""} }; @@ -1901,6 +1907,14 @@ namespace checkers { {27,0,1,Req} }; + const std::vector misraCpp2023Directives = + { + {0,3,1,Adv}, + {0,3,2,Req}, + {5,7,2,Adv}, + {15,8,1,Req}, + }; + const std::vector misraCpp2023Rules = { {0,0,1,Req}, @@ -1911,15 +1925,12 @@ namespace checkers { {0,2,2,Req}, {0,2,3,Adv}, {0,2,4,Adv}, - {0,3,1,Adv}, - {0,3,2,Req}, {4,1,1,Req}, {4,1,2,Adv}, {4,1,3,Req}, {4,6,1,Req}, {5,0,1,Adv}, {5,7,1,Req}, - {5,7,2,Adv}, {5,7,3,Req}, {5,10,1,Req}, {5,13,1,Req}, @@ -2025,7 +2036,6 @@ namespace checkers { {15,1,3,Req}, {15,1,4,Adv}, {15,1,5,Req}, - {15,8,1,Req}, {16,5,2,Req}, {16,6,1,Adv}, {17,8,1,Req}, @@ -2750,53 +2760,53 @@ std::vector checkers::certCppInfo{ {"DCL51-CPP", "L3"}, {"DCL52-CPP", "L3"}, {"DCL53-CPP", "L3"}, - {"DCL54-CPP", "L2"}, + {"DCL54-CPP", "L3"}, {"DCL55-CPP", "L3"}, {"DCL56-CPP", "L3"}, {"DCL57-CPP", "L2"}, {"DCL58-CPP", "L2"}, {"DCL59-CPP", "L3"}, - {"DCL60-CPP", "L3"}, + {"DCL60-CPP", "L2"}, {"EXP50-CPP", "L2"}, {"EXP51-CPP", "L3"}, {"EXP52-CPP", "L3"}, {"EXP53-CPP", "L1"}, {"EXP54-CPP", "L2"}, - {"EXP55-CPP", "L2"}, + {"EXP55-CPP", "L3"}, {"EXP56-CPP", "L3"}, {"EXP57-CPP", "L3"}, {"EXP58-CPP", "L3"}, {"EXP59-CPP", "L3"}, - {"EXP60-CPP", "L1"}, + {"EXP60-CPP", "L2"}, {"EXP61-CPP", "L2"}, - {"EXP62-CPP", "L2"}, + {"EXP62-CPP", "L1"}, {"EXP63-CPP", "L2"}, {"INT50-CPP", "L3"}, {"CTR50-CPP", "L2"}, {"CTR51-CPP", "L2"}, - {"CTR52-CPP", "L1"}, + {"CTR52-CPP", "L2"}, {"CTR53-CPP", "L2"}, - {"CTR54-CPP", "L2"}, - {"CTR55-CPP", "L1"}, + {"CTR54-CPP", "L3"}, + {"CTR55-CPP", "L2"}, {"CTR56-CPP", "L2"}, {"CTR57-CPP", "L3"}, - {"CTR58-CPP", "L3"}, - {"STR50-CPP", "L1"}, + {"CTR58-CPP", "L2"}, + {"STR50-CPP", "L2"}, {"STR51-CPP", "L1"}, {"STR52-CPP", "L2"}, - {"STR53-CPP", "L2"}, - {"MEM50-CPP", "L1"}, - {"MEM51-CPP", "L1"}, + {"STR53-CPP", "L3"}, + {"MEM50-CPP", "L2"}, + {"MEM51-CPP", "L2"}, {"MEM52-CPP", "L1"}, - {"MEM53-CPP", "L1"}, - {"MEM54-CPP", "L1"}, - {"MEM55-CPP", "L1"}, - {"MEM56-CPP", "L1"}, - {"MEM57-CPP", "L2"}, + {"MEM53-CPP", "L2"}, + {"MEM54-CPP", "L2"}, + {"MEM55-CPP", "L2"}, + {"MEM56-CPP", "L2"}, + {"MEM57-CPP", "L3"}, {"FIO50-CPP", "L2"}, {"FIO51-CPP", "L3"}, {"ERR50-CPP", "L3"}, - {"ERR51-CPP", "L3"}, + {"ERR51-CPP", "L2"}, {"ERR52-CPP", "L3"}, {"ERR53-CPP", "L3"}, {"ERR54-CPP", "L1"}, @@ -2804,27 +2814,27 @@ std::vector checkers::certCppInfo{ {"ERR56-CPP", "L2"}, {"ERR57-CPP", "L3"}, {"ERR58-CPP", "L2"}, - {"ERR59-CPP", "L1"}, + {"ERR59-CPP", "L2"}, {"ERR60-CPP", "L3"}, {"ERR61-CPP", "L3"}, {"ERR62-CPP", "L3"}, {"OOP50-CPP", "L3"}, {"OOP51-CPP", "L3"}, - {"OOP52-CPP", "L2"}, - {"OOP53-CPP", "L3"}, + {"OOP52-CPP", "L3"}, + {"OOP53-CPP", "L2"}, {"OOP54-CPP", "L3"}, {"OOP55-CPP", "L2"}, {"OOP56-CPP", "L3"}, - {"OOP57-CPP", "L2"}, + {"OOP57-CPP", "L1"}, {"OOP58-CPP", "L2"}, {"CON50-CPP", "L3"}, {"CON51-CPP", "L2"}, - {"CON52-CPP", "L2"}, + {"CON52-CPP", "L3"}, {"CON53-CPP", "L3"}, {"CON54-CPP", "L3"}, {"CON55-CPP", "L3"}, {"CON56-CPP", "L3"}, - {"MSC50-CPP", "L2"}, + {"MSC50-CPP", "L3"}, {"MSC51-CPP", "L1"}, {"MSC52-CPP", "L2"}, {"MSC53-CPP", "L3"}, diff --git a/lib/checkers.h b/lib/checkers.h index 385b2971ed0..a9329d6c08f 100644 --- a/lib/checkers.h +++ b/lib/checkers.h @@ -68,6 +68,7 @@ namespace checkers { extern CPPCHECKLIB const std::vector misraC2025Directives; extern CPPCHECKLIB const std::vector misraC2025Rules; extern CPPCHECKLIB const std::vector misraCpp2008Rules; + extern CPPCHECKLIB const std::vector misraCpp2023Directives; extern CPPCHECKLIB const std::vector misraCpp2023Rules; struct CPPCHECKLIB IdMapping { diff --git a/lib/errorlogger.cpp b/lib/errorlogger.cpp index cb8edb9d72b..183d130025a 100644 --- a/lib/errorlogger.cpp +++ b/lib/errorlogger.cpp @@ -983,17 +983,22 @@ std::string getClassification(const std::string &guideline, ReportType reportTyp case ReportType::misraCpp2008: case ReportType::misraCpp2023: { - char delim; const std::vector *info; + std::vector components; + if (reportType == ReportType::misraCpp2008) { - delim = '-'; info = &checkers::misraCpp2008Rules; + components = splitString(guideline, '-'); } else { - delim = '.'; - info = &checkers::misraCpp2023Rules; + if (guideline.rfind("Dir ", 0) == 0) { + components = splitString(guideline.substr(4), '.'); + info = &checkers::misraCpp2023Directives; + } else { + components = splitString(guideline, '.'); + info = &checkers::misraCpp2023Rules; + } } - auto components = splitString(guideline, delim); if (components.size() != 3) return ""; diff --git a/test/testerrorlogger.cpp b/test/testerrorlogger.cpp index f0a1af7d631..aa4d2f3e223 100644 --- a/test/testerrorlogger.cpp +++ b/test/testerrorlogger.cpp @@ -334,6 +334,8 @@ class TestErrorLogger : public TestFixture { testReportType(ReportType::misraC2012, Severity::error, "unusedVariable", "Advisory", "2.8"); testReportType(ReportType::misraCpp2023, Severity::warning, "premium-misra-cpp-2023-6.8.4", "Advisory", "6.8.4"); testReportType(ReportType::misraCpp2023, Severity::style, "premium-misra-cpp-2023-19.6.1", "Advisory", "19.6.1"); + testReportType(ReportType::misraCpp2023, Severity::style, "premium-misra-cpp-2023-dir-0.3.1", "Advisory", "Dir 0.3.1"); + testReportType(ReportType::misraCpp2023, Severity::style, "premium-misra-cpp-2023-dir-0.3.2", "Required", "Dir 0.3.2"); testReportType(ReportType::misraCpp2008, Severity::style, "premium-misra-cpp-2008-3-4-1", "Required", "3-4-1"); testReportType(ReportType::misraC2012, Severity::style, "premium-misra-c-2012-dir-4.6", "Advisory", "Dir 4.6"); testReportType(ReportType::misraC2012, Severity::style, "misra-c2012-dir-4.6", "Advisory", "Dir 4.6"); diff --git a/tools/get_checkers.py b/tools/get_checkers.py index 4d5c708ea68..1d19c3a123a 100644 --- a/tools/get_checkers.py +++ b/tools/get_checkers.py @@ -367,6 +367,14 @@ {27,0,1,Req} }; + const std::vector misraCpp2023Directives = + { + {0,3,1,Adv}, + {0,3,2,Req}, + {5,7,2,Adv}, + {15,8,1,Req}, + }; + const std::vector misraCpp2023Rules = { {0,0,1,Req}, @@ -377,15 +385,12 @@ {0,2,2,Req}, {0,2,3,Adv}, {0,2,4,Adv}, - {0,3,1,Adv}, - {0,3,2,Req}, {4,1,1,Req}, {4,1,2,Adv}, {4,1,3,Req}, {4,6,1,Req}, {5,0,1,Adv}, {5,7,1,Req}, - {5,7,2,Adv}, {5,7,3,Req}, {5,10,1,Req}, {5,13,1,Req}, @@ -491,7 +496,6 @@ {15,1,3,Req}, {15,1,4,Adv}, {15,1,5,Req}, - {15,8,1,Req}, {16,5,2,Req}, {16,6,1,Adv}, {17,8,1,Req},