Skip to content

C++: Improve logic for perfect forwarding - #22654

Open
MathiasVP wants to merge 26 commits into
github:mainfrom
MathiasVP:fix-forward-interpretation
Open

MathiasVP wants to merge 26 commits into
github:mainfrom
MathiasVP:fix-forward-interpretation

Conversation

@MathiasVP

@MathiasVP MathiasVP commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

In #22532 we added support for specifying whether a modelled function forward all its arguments. However, we implemented very some naive logic for identifying the constructor to invoke when given a type and a set of argument types. This PR fixes that by modelling (to the best of my abilities) the conversion rules and type matching of C++ to correctly map a list of arguments to a constructor.

We use a flow-based approach where we check if a sequence of steps can flow from a "source" (an argument type) to a "sink" (a constructor parameter type) using 0 or more steps (type conversions).

Unsurprisingly, C++ rules make this rather complicated. There are a few missing results still (related to how CV qualifiers are being treated), and spurious results (related to how overload resolution ranks conversions) but I'd prefer to leave those for as future work.

There are many commits since I worked tirelessly to ensure that each commit can be reviewed in isolation. Please thank me by reviewing it commit-by-commit! 😅

DCA is uneventful since we don't yet use this feature in any non-test models. However, I've got a PR coming up that makes heavy use of this where this makes a real difference.

@github-actions github-actions Bot added the C++ label Sep 22, 2026
Comment thread cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll Dismissed
@MathiasVP
MathiasVP force-pushed the fix-forward-interpretation branch from 3602750 to 0f32801 Compare September 22, 2026 18:19
@MathiasVP
MathiasVP marked this pull request as ready for review October 5, 2026 13:06
@MathiasVP
MathiasVP requested a review from a team as a code owner October 5, 2026 13:06
Copilot AI balanced review requested due to automatic review settings October 5, 2026 13:06
@MathiasVP MathiasVP added the no-change-note-required This PR does not need a change note label Oct 5, 2026

Copilot AI 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.

Copilot review overview

🟡 Changes recommended

Zero-argument forwarding currently cannot select a zero-parameter constructor.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)
What changed in this PR

Improves constructor selection for C++ perfect-forwarding models using conversion-aware type matching.

Changes:

  • Models standard and user-defined conversions, value categories, and reference binding.
  • Integrates constructor selection into synthetic data-flow nodes.
  • Adds comprehensive forwarding tests and updates existing expectations.
File Description
forwarding/​test.ql Tests selected constructors.
forwarding/​test.ext.yml Defines the test forwarding model.
forwarding/​test.expected Records test expectations.
forwarding/​test.cpp Covers C++ conversion scenarios.
external-models/​test.cpp Updates known forwarding false positives.
external-models/​flow.expected Updates generated flow expectations.
DataFlowPrivate.qll Delegates constructor selection.
DataFlowNodes.qll Connects forwarding nodes to the new logic.
ExternalFlow.qll Implements conversion-aware constructor matching.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll
Comment thread cpp/ql/test/library-tests/dataflow/forwarding/test.cpp Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

This branch has not been deployed

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

Labels

C++ no-change-note-required This PR does not need a change note

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants