Index: clang-tidy/misc/SuspiciousMissingCommaCheck.cpp =================================================================== --- clang-tidy/misc/SuspiciousMissingCommaCheck.cpp +++ clang-tidy/misc/SuspiciousMissingCommaCheck.cpp @@ -86,9 +86,11 @@ const auto ConcatenatedStringLiteral = stringLiteral(isConcatenatedLiteral(MaxConcatenatedTokens)).bind("str"); - const auto StringsInitializerList = - initListExpr(hasType(constantArrayType()), - has(expr(ignoringImpCasts(ConcatenatedStringLiteral)))); + const auto StringsInitializerList = initListExpr( + hasType(constantArrayType()), + has(expr(ignoringImpCasts(ConcatenatedStringLiteral))), + hasParent(varDecl(allOf(hasType(arrayType()), isDefinition())) + .bind("varDecl"))); Finder->addMatcher(StringsInitializerList.bind("list"), this); } @@ -98,10 +100,29 @@ const auto *InitializerList = Result.Nodes.getNodeAs("list"); const auto *ConcatenatedLiteral = Result.Nodes.getNodeAs("str"); - assert(InitializerList && ConcatenatedLiteral); - - // Skip small arrays as they often generate false-positive. + const auto *VariableDeclaration = Result.Nodes.getNodeAs("varDecl"); + assert(InitializerList && ConcatenatedLiteral && VariableDeclaration); + unsigned int Size = InitializerList->getNumInits(); + + // Warn when the explicit given array size isn't equal to the real array size. + QualType DeclType = VariableDeclaration->getTypeSourceInfo()->getType(); + if (DeclType->isConstantArrayType()) { + unsigned int ExplicitArraySize = 0; + ExplicitArraySize = + ((Result.Context)->getAsConstantArrayType(DeclType)->getSize()) + .getLimitedValue(); + + if (Size != ExplicitArraySize) { + diag(InitializerList->getExprLoc(), + "wrong string array initialization: " + "the explicit given size and the " + "real number of elements aren't equal"); + return; + } + } + + // Skip small arrays as they often generate false-positive. if (Size < SizeThreshold) return; // Count the number of occurence of concatenated string literal. Index: docs/clang-tidy/checks/misc-suspicious-missing-comma.rst =================================================================== --- docs/clang-tidy/checks/misc-suspicious-missing-comma.rst +++ docs/clang-tidy/checks/misc-suspicious-missing-comma.rst @@ -42,3 +42,14 @@ "Warning %s", }; +This checker is also capable of warn on cases when the explicitly given array size +isn't equal to the real array size. + +.. code:: c++ + + const char* TheThreeMusketeers[4] = { + "Athos", + "Porthos", + "Aramis" + "D'Artagnan" + }; Index: test/clang-tidy/misc-suspicious-missing-comma.cpp =================================================================== --- test/clang-tidy/misc-suspicious-missing-comma.cpp +++ test/clang-tidy/misc-suspicious-missing-comma.cpp @@ -80,3 +80,21 @@ "Dummy line", "Dummy line", }; + +// Missing comma or wrong explicit array size. +const char* TheThreeMusketeers[4] = { + "Athos", + "Porthos", + "Aramis" + "D'Artagnan" +}; +// CHECK-MESSAGES: :[[@LINE-6]]:3: warning: wrong string array initialization: the explicit given size and the real number of elements aren't equal [misc-suspicious-missing-comma] + +// Correctly given array size should avoid warning. +const char* TheFourMusketeers[4] = { + "Athos", + "Porthos", + "Aramis", + "Charles de Batz de Castelmore" + "D'Artagnan" +};