Klocwork static code analysis exposed this bug: Pointer 'Constraint' returned from call to function 'cast_or_null<clang::ConceptSpecializationExpr,clang::Expr>' may be NULL and will be dereferenced in the statement following it Replace 'cast_or_null' with 'cast' so that the latter can assert when it encounters a NULL
Details
- Reviewers
erichkeane saar.raz aaron.ballman
Diff Detail
Event Timeline
Thanks for the cleanup! Btw, it's helpful if you add more context to the patch when generating the diff. I typically use git diff -U9999 when generating a diff as that gives plenty of context for the patch review within Phabricator.
clang/lib/Sema/SemaConcept.cpp | ||
---|---|---|
1065–1068 | If we're going to be touching this code, there's more suspect code here that needs to be cleaned up a bit. Directly above this is: const TypeConstraint *TC = cast<TemplateTypeParmDecl>(TPL->getParam(0))->getTypeConstraint(); assert(TC && "TPL must have a template type parameter with a type constraint"); That assertion can be removed entirely -- if the cast<> fails, it doesn't return null, it asserts. |
LGTM, thanks for the cleanup! Do you need someone to commit on your behalf? If so, what name and email address would you like me to use for patch attribution?
clang/lib/Sema/SemaConcept.cpp | ||
---|---|---|
1065–1068 | Actually, cast return nonnull value, but TC = "cast_result"->getTypeConstraint(); and TC may become nullptr, I suppose. |
clang/lib/Sema/SemaConcept.cpp | ||
---|---|---|
1065–1068 | Good catch! I think we should add the assertion on TC being nonnull back. I'll take care of that. |
clang/lib/Sema/SemaConcept.cpp | ||
---|---|---|
1065–1068 | Ooh, good catch! I definitely missed that when suggesting removing the assert. @aaron.ballman can you re-add the assert on 1065? |
clang/lib/Sema/SemaConcept.cpp | ||
---|---|---|
1065–1068 | I've put the assert back in 0cf4f81082e9fa052e60450b8cbb10007e59931c, thanks for letting us know @mlychkov! |
If we're going to be touching this code, there's more suspect code here that needs to be cleaned up a bit. Directly above this is:
That assertion can be removed entirely -- if the cast<> fails, it doesn't return null, it asserts.