Skip to content

Fix #15197 FP uninitMemberVarNoCtor for class without constructor that has a member of a type without default constructor - #9013

Open
autoantwort wants to merge 1 commit into
cppcheck-opensource:mainfrom
autoantwort:fix-15197-uninitMemberVarNoCtor-nodefault
Open

autoantwort wants to merge 1 commit into
cppcheck-opensource:mainfrom
autoantwort:fix-15197-uninitMemberVarNoCtor-nodefault

Conversation

@autoantwort

Copy link
Copy Markdown
Contributor

Trac: https://trac.cppcheck.net/ticket/15197

Follow-up to #15080: a class without constructors that has a member whose type has no default constructor cannot be default-initialized. Every instance initializes all members, so uninitMemberVarNoCtor is a false positive:

struct N {
    explicit N(int);
};

struct S {
    N n;
    int i;          // FP: Member variable 'S::i' has no initializer. [uninitMemberVarNoCtor]
    bool b = true;
};

Cause: CheckClass::constructors() marks a class without constructors as not default-constructible only for reference members and const members of non-class type.

Fix: also mark it for a (non-pointer) member whose class type has constructors but none callable without arguments. A deleted default constructor doesn't count. A variadic constructor counts as default constructor if only the parameter pack or ellipsis is left.

Limitations (still reported as before):

  • library types without default constructor, e.g. std::reference_wrapper (std.cfg has no such information)
  • base classes without default constructor
  • members of aggregates that are themselves not default-constructible, and private default constructors
  • member types cppcheck does not resolve to a scope (e.g. decltype(...))

This PR was created by Claude Code (an AI coding agent) on behalf of @autoantwort.

🤖 Generated with Claude Code

…t has a member of a type without default constructor

Co-Authored-By: Claude Opus 5.5 <[email protected]>

@dmcppcheck dmcppcheck left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI review

I found no problems with this change. Classes with no constructors now count as not default-constructible when they have a non-pointer member whose class type has constructors but none that can be called without arguments. I tested about 30 variations. Every result was correct except the limitations that the PR description already lists (for example, inherited constructors without a default constructor are still reported). The variadic rule minArgCount() == 1 works the way the PR says: F(int = 0, ...) and V(A&&...) count as default constructors, while E(int, ...) and template<class... A> V(int, A...) don't. comments.md has no earlier comments.

Testing

  • Built cppcheck and testrunner in pr/ and cppcheck in base/.
  • ./testrunner TestConstructors TestClass: 0 failures. The full ./testrunner -q also had 0 failures.
  • I wrote scratch files and compared pr/cppcheck with base/cppcheck, running both as cppcheck -q --enable=warning --std=c++17 t*.cpp.
  • No longer reported (correct):
    • a member type whose only constructors are deleted (X() = delete; X(int) = delete;)
    • a member type with only a defaulted copy constructor
    • a member type with only a deleted copy constructor
    • a nested member type S::N with N(int)
    • E(int, ...)
    • template<class... A> V(int, A...)
  • Still reported (correct):
    • std::vector<N>
    • a template wrapper that has a default constructor (Opt<N>)
    • a type that has both P(int) and P()
    • DD() = default
    • H(void)
    • F(int = 0, ...)
    • I(std::initializer_list<int> = {})
    • a template constructor with defaulted parameters
    • a static member whose type has no default constructor
    • a namespace-local type that has the same name as a global one
    • an explicit specialization B<int> that has no constructors, while the primary template has B(T)
  • Known limitation: struct K : N { using N::N; }; is still reported. This falls under the base-class limitation in the PR description.
  • I found no crashes, hangs or new false positives.

Automated review of eb7b004 by Claude. The pull request was built and tested locally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants