Skip to content

Commit 50be22d

Browse files
authored
Fix #12710 (Checkers report: update premium checkers info) (#6360)
1 parent 665cfce commit 50be22d

12 files changed

Lines changed: 200 additions & 39 deletions

lib/checkbool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ void CheckBool::assignBoolToPointerError(const Token *tok)
341341
//-----------------------------------------------------------------------------
342342
void CheckBool::checkComparisonOfBoolExpressionWithInt()
343343
{
344-
if (!mSettings->severity.isEnabled(Severity::warning))
344+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("compareBoolExpressionWithInt"))
345345
return;
346346

347347
logChecker("CheckBool::checkComparisonOfBoolExpressionWithInt"); // warning

lib/checkclass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,7 +1714,7 @@ void CheckClass::operatorEqMissingReturnStatementError(const Token *tok, bool er
17141714

17151715
void CheckClass::operatorEqToSelf()
17161716
{
1717-
if (!mSettings->severity.isEnabled(Severity::warning))
1717+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("operatorEqToSelf"))
17181718
return;
17191719

17201720
logChecker("CheckClass::operatorEqToSelf"); // warning
@@ -2953,7 +2953,7 @@ void CheckClass::pureVirtualFunctionCallInConstructorError(
29532953

29542954
void CheckClass::checkDuplInheritedMembers()
29552955
{
2956-
if (!mSettings->severity.isEnabled(Severity::warning))
2956+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("duplInheritedMember"))
29572957
return;
29582958

29592959
logChecker("CheckClass::checkDuplInheritedMembers"); // warning

lib/checkcondition.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,9 @@ static bool isNonConstFunctionCall(const Token *ftok, const Library &library)
613613

614614
void CheckCondition::multiCondition2()
615615
{
616-
if (!mSettings->severity.isEnabled(Severity::warning))
616+
if (!mSettings->severity.isEnabled(Severity::warning) &&
617+
!mSettings->isPremiumEnabled("identicalConditionAfterEarlyExit") &&
618+
!mSettings->isPremiumEnabled("identicalInnerCondition"))
617619
return;
618620

619621
logChecker("CheckCondition::multiCondition2"); // warning
@@ -1482,7 +1484,8 @@ void CheckCondition::alwaysTrueFalse()
14821484
{
14831485
if (!mSettings->severity.isEnabled(Severity::style) &&
14841486
!mSettings->isPremiumEnabled("alwaysTrue") &&
1485-
!mSettings->isPremiumEnabled("alwaysFalse"))
1487+
!mSettings->isPremiumEnabled("alwaysFalse") &&
1488+
!mSettings->isPremiumEnabled("knownConditionTrueFalse"))
14861489
return;
14871490

14881491
logChecker("CheckCondition::alwaysTrueFalse"); // style

lib/checkers.cpp

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ namespace checkers {
9494
{"CheckOther::checkUnreachableCode","style"},
9595
{"CheckOther::checkVariableScope","style,notclang"},
9696
{"CheckOther::checkPassByReference","performance,c++"},
97+
{"CheckOther::checkConstVariable","style,c++"},
9798
{"CheckOther::checkConstPointer","style"},
9899
{"CheckOther::checkCharVariable","warning,portability"},
99100
{"CheckOther::checkIncompleteStatement","warning"},
@@ -146,6 +147,7 @@ namespace checkers {
146147
{"CheckUnusedVar::checkStructMemberUsage","style"},
147148
{"CheckIO::checkCoutCerrMisusage","c"},
148149
{"CheckIO::checkFileUsage",""},
150+
{"CheckIO::invalidScanf",""},
149151
{"CheckIO::checkWrongPrintfScanfArguments",""},
150152
{"CheckCondition::assignIf","style"},
151153
{"CheckCondition::checkBadBitmaskCheck","style"},
@@ -202,6 +204,7 @@ namespace checkers {
202204
{"CheckMemoryLeakInClass::check",""},
203205
{"CheckMemoryLeakStructMember::check",""},
204206
{"CheckMemoryLeakNoVar::check",""},
207+
{"CheckMemoryLeakNoVar::checkForUnsafeArgAlloc",""},
205208
};
206209

207210
const std::map<std::string, std::string> premiumCheckers{
@@ -230,7 +233,6 @@ namespace checkers {
230233
{"Autosar: A2-13-1",""},
231234
{"Autosar: A2-13-3",""},
232235
{"Autosar: A2-13-5",""},
233-
{"Autosar: A2-13-6",""},
234236
{"Autosar: A2-5-2",""},
235237
{"Autosar: A20-8-2","warning"},
236238
{"Autosar: A20-8-3","warning"},
@@ -404,6 +406,9 @@ namespace checkers {
404406
{"Cert C: STR32-C",""},
405407
{"Cert C: STR34-C",""},
406408
{"Cert C: STR38-C",""},
409+
{"Misra C++ 2008: 3-2-3",""},
410+
{"Misra C++ 2008: 3-2-4",""},
411+
{"Misra C++ 2008: 7-5-4",""},
407412
{"Misra C++ 2008: M0-1-11",""},
408413
{"Misra C++ 2008: M0-1-12",""},
409414
{"Misra C++ 2008: M0-1-4",""},
@@ -578,55 +583,115 @@ namespace checkers {
578583
{"Misra C++ 2008: M9-6-2",""},
579584
{"Misra C++ 2008: M9-6-3",""},
580585
{"Misra C++ 2008: M9-6-4",""},
586+
{"Misra C++ 2023: 0.1.2",""},
581587
{"Misra C++ 2023: 0.2.1",""},
588+
{"Misra C++ 2023: 0.2.2",""},
589+
{"Misra C++ 2023: 0.2.3",""},
590+
{"Misra C++ 2023: 0.2.4",""},
582591
{"Misra C++ 2023: 10.0.1",""},
583592
{"Misra C++ 2023: 10.1.2",""},
584593
{"Misra C++ 2023: 10.2.1",""},
585594
{"Misra C++ 2023: 10.2.2",""},
586595
{"Misra C++ 2023: 10.2.3",""},
596+
{"Misra C++ 2023: 10.3.1",""},
587597
{"Misra C++ 2023: 10.4.1",""},
588598
{"Misra C++ 2023: 11.3.1",""},
599+
{"Misra C++ 2023: 11.3.2",""},
589600
{"Misra C++ 2023: 11.6.1",""},
590601
{"Misra C++ 2023: 11.6.3",""},
591602
{"Misra C++ 2023: 12.2.1",""},
603+
{"Misra C++ 2023: 12.2.2",""},
604+
{"Misra C++ 2023: 12.2.3",""},
605+
{"Misra C++ 2023: 12.3.1",""},
592606
{"Misra C++ 2023: 13.1.1",""},
607+
{"Misra C++ 2023: 13.1.2",""},
593608
{"Misra C++ 2023: 13.3.1",""},
594609
{"Misra C++ 2023: 13.3.2",""},
595610
{"Misra C++ 2023: 13.3.3",""},
596611
{"Misra C++ 2023: 13.3.4",""},
597612
{"Misra C++ 2023: 14.1.1",""},
598613
{"Misra C++ 2023: 15.0.1",""},
599614
{"Misra C++ 2023: 15.0.2",""},
615+
{"Misra C++ 2023: 15.1.2",""},
600616
{"Misra C++ 2023: 15.1.3",""},
601617
{"Misra C++ 2023: 15.1.5",""},
618+
{"Misra C++ 2023: 16.5.1",""},
619+
{"Misra C++ 2023: 16.5.2",""},
620+
{"Misra C++ 2023: 16.6.1",""},
602621
{"Misra C++ 2023: 17.8.1",""},
622+
{"Misra C++ 2023: 18.1.1",""},
623+
{"Misra C++ 2023: 18.1.2",""},
624+
{"Misra C++ 2023: 18.3.1",""},
625+
{"Misra C++ 2023: 18.3.2",""},
626+
{"Misra C++ 2023: 18.3.3",""},
603627
{"Misra C++ 2023: 18.4.1",""},
628+
{"Misra C++ 2023: 18.5.1",""},
604629
{"Misra C++ 2023: 18.5.2",""},
630+
{"Misra C++ 2023: 19.0.1",""},
631+
{"Misra C++ 2023: 19.0.2",""},
632+
{"Misra C++ 2023: 19.0.3",""},
633+
{"Misra C++ 2023: 19.0.4",""},
634+
{"Misra C++ 2023: 19.1.1",""},
635+
{"Misra C++ 2023: 19.1.2",""},
636+
{"Misra C++ 2023: 19.1.3",""},
637+
{"Misra C++ 2023: 19.2.1",""},
638+
{"Misra C++ 2023: 19.2.2",""},
639+
{"Misra C++ 2023: 19.2.3",""},
640+
{"Misra C++ 2023: 19.3.1",""},
605641
{"Misra C++ 2023: 19.3.2",""},
606642
{"Misra C++ 2023: 19.3.3",""},
607-
{"Misra C++ 2023: 21.20.1",""},
608-
{"Misra C++ 2023: 21.20.2",""},
643+
{"Misra C++ 2023: 19.3.4",""},
644+
{"Misra C++ 2023: 19.6.1",""},
645+
{"Misra C++ 2023: 21.10.1",""},
646+
{"Misra C++ 2023: 21.10.2",""},
647+
{"Misra C++ 2023: 21.10.3",""},
648+
{"Misra C++ 2023: 21.2.1",""},
649+
{"Misra C++ 2023: 21.2.2",""},
650+
{"Misra C++ 2023: 21.2.3",""},
651+
{"Misra C++ 2023: 21.2.4",""},
652+
{"Misra C++ 2023: 21.6.1",""},
653+
{"Misra C++ 2023: 21.6.2",""},
609654
{"Misra C++ 2023: 21.6.3",""},
610655
{"Misra C++ 2023: 21.6.4",""},
611656
{"Misra C++ 2023: 21.6.5",""},
612657
{"Misra C++ 2023: 22.3.1",""},
613658
{"Misra C++ 2023: 22.4.1",""},
659+
{"Misra C++ 2023: 23.11.1",""},
614660
{"Misra C++ 2023: 24.5.1",""},
615661
{"Misra C++ 2023: 24.5.2",""},
616662
{"Misra C++ 2023: 25.5.1",""},
617663
{"Misra C++ 2023: 25.5.2",""},
618664
{"Misra C++ 2023: 25.5.3",""},
665+
{"Misra C++ 2023: 26.3.1",""},
666+
{"Misra C++ 2023: 28.3.1",""},
619667
{"Misra C++ 2023: 28.6.1",""},
620668
{"Misra C++ 2023: 28.6.2",""},
669+
{"Misra C++ 2023: 30.0.1",""},
621670
{"Misra C++ 2023: 30.0.2",""},
622671
{"Misra C++ 2023: 4.1.1",""},
623672
{"Misra C++ 2023: 4.1.2",""},
673+
{"Misra C++ 2023: 5.0.1",""},
674+
{"Misra C++ 2023: 5.13.1",""},
624675
{"Misra C++ 2023: 5.13.2",""},
676+
{"Misra C++ 2023: 5.13.3",""},
677+
{"Misra C++ 2023: 5.13.4",""},
625678
{"Misra C++ 2023: 5.13.5",""},
626679
{"Misra C++ 2023: 5.13.6",""},
680+
{"Misra C++ 2023: 5.13.7",""},
681+
{"Misra C++ 2023: 5.7.1",""},
682+
{"Misra C++ 2023: 5.7.2",""},
627683
{"Misra C++ 2023: 5.7.3",""},
684+
{"Misra C++ 2023: 6.0.1",""},
685+
{"Misra C++ 2023: 6.0.2",""},
686+
{"Misra C++ 2023: 6.0.3",""},
687+
{"Misra C++ 2023: 6.0.4",""},
688+
{"Misra C++ 2023: 6.2.2",""},
689+
{"Misra C++ 2023: 6.2.3",""},
690+
{"Misra C++ 2023: 6.2.4",""},
628691
{"Misra C++ 2023: 6.4.2",""},
629692
{"Misra C++ 2023: 6.4.3",""},
693+
{"Misra C++ 2023: 6.5.1",""},
694+
{"Misra C++ 2023: 6.5.2",""},
630695
{"Misra C++ 2023: 6.7.1",""},
631696
{"Misra C++ 2023: 6.7.2",""},
632697
{"Misra C++ 2023: 6.8.3",""},
@@ -636,20 +701,42 @@ namespace checkers {
636701
{"Misra C++ 2023: 7.0.1",""},
637702
{"Misra C++ 2023: 7.0.2",""},
638703
{"Misra C++ 2023: 7.0.3",""},
704+
{"Misra C++ 2023: 7.0.4",""},
639705
{"Misra C++ 2023: 7.0.5",""},
640706
{"Misra C++ 2023: 7.0.6",""},
707+
{"Misra C++ 2023: 7.11.1",""},
708+
{"Misra C++ 2023: 7.11.2",""},
709+
{"Misra C++ 2023: 7.11.3",""},
710+
{"Misra C++ 2023: 8.0.1",""},
641711
{"Misra C++ 2023: 8.1.1",""},
712+
{"Misra C++ 2023: 8.1.2",""},
713+
{"Misra C++ 2023: 8.14.1",""},
714+
{"Misra C++ 2023: 8.18.2",""},
715+
{"Misra C++ 2023: 8.19.1",""},
716+
{"Misra C++ 2023: 8.2.1",""},
717+
{"Misra C++ 2023: 8.2.10",""},
642718
{"Misra C++ 2023: 8.2.11",""},
643719
{"Misra C++ 2023: 8.2.2",""},
644720
{"Misra C++ 2023: 8.2.3",""},
645721
{"Misra C++ 2023: 8.2.4",""},
722+
{"Misra C++ 2023: 8.2.5",""},
723+
{"Misra C++ 2023: 8.2.6",""},
724+
{"Misra C++ 2023: 8.2.7",""},
646725
{"Misra C++ 2023: 8.2.8",""},
647726
{"Misra C++ 2023: 8.2.9",""},
727+
{"Misra C++ 2023: 8.20.1",""},
728+
{"Misra C++ 2023: 8.3.1",""},
648729
{"Misra C++ 2023: 8.3.2",""},
649730
{"Misra C++ 2023: 9.2.1",""},
731+
{"Misra C++ 2023: 9.3.1",""},
732+
{"Misra C++ 2023: 9.4.1",""},
733+
{"Misra C++ 2023: 9.4.2",""},
650734
{"Misra C++ 2023: 9.5.1",""},
651735
{"Misra C++ 2023: 9.5.2",""},
652736
{"Misra C++ 2023: 9.6.1",""},
737+
{"Misra C++ 2023: 9.6.2",""},
738+
{"Misra C++ 2023: 9.6.3",""},
739+
{"Misra C++ 2023: 9.6.4",""},
653740
{"Misra C: 1.4",""},
654741
{"Misra C: 1.5",""},
655742
{"Misra C: 10.1",""},
@@ -675,6 +762,7 @@ namespace checkers {
675762
{"Misra C: 17.11",""},
676763
{"Misra C: 17.12",""},
677764
{"Misra C: 17.13",""},
765+
{"Misra C: 17.2",""},
678766
{"Misra C: 17.3",""},
679767
{"Misra C: 17.4",""},
680768
{"Misra C: 17.9",""},
@@ -720,6 +808,8 @@ namespace checkers {
720808
{"Misra C: 8.17",""},
721809
{"Misra C: 8.3",""},
722810
{"Misra C: 8.4",""},
811+
{"Misra C: 8.6",""},
812+
{"Misra C: 8.7",""},
723813
{"Misra C: 8.8",""},
724814
{"Misra C: 9.6",""},
725815
{"Misra C: 9.7",""},

lib/checkio.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,11 @@ void CheckIO::incompatibleFileOpenError(const Token *tok, const std::string &fil
411411
//---------------------------------------------------------------------------
412412
void CheckIO::invalidScanf()
413413
{
414-
if (!mSettings->severity.isEnabled(Severity::warning))
414+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidscanf"))
415415
return;
416416

417+
logChecker("CheckIO::invalidScanf");
418+
417419
const SymbolDatabase * const symbolDatabase = mTokenizer->getSymbolDatabase();
418420
for (const Scope * scope : symbolDatabase->functionScopes) {
419421
for (const Token *tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) {
@@ -1710,7 +1712,7 @@ void CheckIO::wrongPrintfScanfArgumentsError(const Token* tok,
17101712
nonneg int numFunction)
17111713
{
17121714
const Severity severity = numFormat > numFunction ? Severity::error : Severity::warning;
1713-
if (severity != Severity::error && !mSettings->severity.isEnabled(Severity::warning))
1715+
if (severity != Severity::error && !mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfArgNum"))
17141716
return;
17151717

17161718
std::ostringstream errmsg;
@@ -1729,7 +1731,7 @@ void CheckIO::wrongPrintfScanfArgumentsError(const Token* tok,
17291731
void CheckIO::wrongPrintfScanfPosixParameterPositionError(const Token* tok, const std::string& functionName,
17301732
nonneg int index, nonneg int numFunction)
17311733
{
1732-
if (!mSettings->severity.isEnabled(Severity::warning))
1734+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("wrongPrintfScanfParameterPositionError"))
17331735
return;
17341736
std::ostringstream errmsg;
17351737
errmsg << functionName << ": ";
@@ -1992,7 +1994,7 @@ void CheckIO::argumentType(std::ostream& os, const ArgumentInfo * argInfo)
19921994

19931995
void CheckIO::invalidLengthModifierError(const Token* tok, nonneg int numFormat, const std::string& modifier)
19941996
{
1995-
if (!mSettings->severity.isEnabled(Severity::warning))
1997+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("invalidLengthModifierError"))
19961998
return;
19971999
std::ostringstream errmsg;
19982000
errmsg << "'" << modifier << "' in format string (no. " << numFormat << ") is a length modifier and cannot be used without a conversion specifier.";

lib/checkmemoryleak.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1093,9 +1093,14 @@ void CheckMemoryLeakNoVar::checkForUnusedReturnValue(const Scope *scope)
10931093
void CheckMemoryLeakNoVar::checkForUnsafeArgAlloc(const Scope *scope)
10941094
{
10951095
// This test only applies to C++ source
1096-
if (!mTokenizer->isCPP() || !mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning))
1096+
if (!mTokenizer->isCPP())
10971097
return;
10981098

1099+
if (!mSettings->isPremiumEnabled("leakUnsafeArgAlloc") && (!mSettings->certainty.isEnabled(Certainty::inconclusive) || !mSettings->severity.isEnabled(Severity::warning)))
1100+
return;
1101+
1102+
logChecker("CheckMemoryLeakNoVar::checkForUnsafeArgAlloc");
1103+
10991104
for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) {
11001105
if (Token::Match(tok, "%name% (")) {
11011106
const Token *endParamToken = tok->next()->link();

lib/checknullpointer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ void CheckNullPointer::nullPointerError(const Token *tok, const std::string &var
441441
return;
442442
}
443443

444-
if (!mSettings->isEnabled(value, inconclusive))
444+
if (!mSettings->isEnabled(value, inconclusive) && !mSettings->isPremiumEnabled("nullPointer"))
445445
return;
446446

447447
const ErrorPath errorPath = getErrorPath(tok, value, "Null pointer dereference");

lib/checkother.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,9 @@ void CheckOther::invalidPointerCastError(const Token* tok, const std::string& fr
424424

425425
void CheckOther::checkRedundantAssignment()
426426
{
427-
if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("redundantAssignment"))
427+
if (!mSettings->severity.isEnabled(Severity::style) &&
428+
!mSettings->isPremiumEnabled("redundantAssignment") &&
429+
!mSettings->isPremiumEnabled("redundantAssignInSwitch"))
428430
return;
429431

430432
logChecker("CheckOther::checkRedundantAssignment"); // style
@@ -773,7 +775,7 @@ void CheckOther::checkUnreachableCode()
773775
// misra-c-2023-2.1
774776
// misra-cpp-2008-0-1-1
775777
// autosar
776-
if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("unreachableCode"))
778+
if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->isPremiumEnabled("duplicateBreak") && !mSettings->isPremiumEnabled("unreachableCode"))
777779
return;
778780

779781
logChecker("CheckOther::checkUnreachableCode"); // style
@@ -1326,9 +1328,11 @@ static bool isVariableMutableInInitializer(const Token* start, const Token * end
13261328

13271329
void CheckOther::checkConstVariable()
13281330
{
1329-
if (!mSettings->severity.isEnabled(Severity::style) || mTokenizer->isC())
1331+
if ((!mSettings->severity.isEnabled(Severity::style) || mTokenizer->isC()) && !mSettings->isPremiumEnabled("constVariable"))
13301332
return;
13311333

1334+
logChecker("CheckOther::checkConstVariable"); // style,c++
1335+
13321336
const SymbolDatabase *const symbolDatabase = mTokenizer->getSymbolDatabase();
13331337

13341338
for (const Variable *var : symbolDatabase->variableList()) {
@@ -1476,6 +1480,7 @@ void CheckOther::checkConstPointer()
14761480
{
14771481
if (!mSettings->severity.isEnabled(Severity::style) &&
14781482
!mSettings->isPremiumEnabled("constParameter") &&
1483+
!mSettings->isPremiumEnabled("constParameterReference") &&
14791484
!mSettings->isPremiumEnabled("constPointer"))
14801485
return;
14811486

@@ -3344,7 +3349,9 @@ void CheckOther::unknownEvaluationOrder(const Token* tok)
33443349

33453350
void CheckOther::checkAccessOfMovedVariable()
33463351
{
3347-
if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11 || !mSettings->severity.isEnabled(Severity::warning))
3352+
if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11)
3353+
return;
3354+
if (!mSettings->isPremiumEnabled("accessMoved") && !mSettings->severity.isEnabled(Severity::warning))
33483355
return;
33493356
logChecker("CheckOther::checkAccessOfMovedVariable"); // c++11,warning
33503357
const bool reportInconclusive = mSettings->certainty.isEnabled(Certainty::inconclusive);

lib/checksizeof.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ void CheckSizeof::sizeofCalculationError(const Token *tok, bool inconclusive)
358358

359359
void CheckSizeof::sizeofFunction()
360360
{
361-
if (!mSettings->severity.isEnabled(Severity::warning))
361+
if (!mSettings->severity.isEnabled(Severity::warning) && !mSettings->isPremiumEnabled("sizeofFunctionCall"))
362362
return;
363363

364364
logChecker("CheckSizeof::sizeofFunction"); // warning

0 commit comments

Comments
 (0)