Repository navigation
Fix #15197 FP uninitMemberVarNoCtor for class without constructor that has a member of a type without default constructor - #9013
Conversation
…t has a member of a type without default constructor Co-Authored-By: Claude Opus 5.5 <[email protected]>
dmcppcheck
left a comment
There was a problem hiding this comment.
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
cppcheckandtestrunnerinpr/andcppcheckinbase/. ./testrunner TestConstructors TestClass: 0 failures. The full./testrunner -qalso had 0 failures.- I wrote scratch files and compared
pr/cppcheckwithbase/cppcheck, running both ascppcheck -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::NwithN(int) E(int, ...)template<class... A> V(int, A...)
- a member type whose only constructors are deleted (
- Still reported (correct):
std::vector<N>- a template wrapper that has a default constructor (
Opt<N>) - a type that has both
P(int)andP() DD() = defaultH(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 hasB(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.
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
uninitMemberVarNoCtoris a false positive: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):
std::reference_wrapper(std.cfg has no such information)decltype(...))This PR was created by Claude Code (an AI coding agent) on behalf of @autoantwort.
🤖 Generated with Claude Code