Skip to content

Don't truncate rmw_time_t QoS durations in the override defaults - #3268

Open
Dev-next-gen wants to merge 2 commits into
ros2:rollingfrom
Dev-next-gen:fix/qos-override-default-rmw-duration-narrowing
Open

Dev-next-gen wants to merge 2 commits into
ros2:rollingfrom
Dev-next-gen:fix/qos-override-default-rmw-duration-narrowing

Conversation

@Dev-next-gen

@Dev-next-gen Dev-next-gen commented Sep 11, 2026 •

Copy link
Copy Markdown

Description

rclcpp::detail::rmw_duration_to_int64_t() converts an rmw_time_t by hand:

return ::rclcpp::Duration(
  static_cast<int32_t>(rmw_duration.sec),
  static_cast<uint32_t>(rmw_duration.nsec)
).nanoseconds();

rmw_time_t::sec is a uint64_t, and the durations that matter here do not fit in an int32_t. RMW_DURATION_INFINITE is {9223372036, 854775807}, and RMW_QOS_DEADLINE_BEST_AVAILABLE / RMW_QOS_LIVELINESS_LEASE_DURATION_BEST_AVAILABLE are {9223372036, 854775806}. Casting 9223372036 to int32_t wraps to 633437444, so the helper returns 633437444854775807 ns where it should return 9223372036854775807 ns.

declare_qos_parameters() uses that value twice: as the default for the deadline, lifespan and liveliness_lease_duration override parameters, and then it feeds the declared value back into the profile through apply_qos_override(). So enabling those overrides on a profile carrying an infinite duration silently turns it into a finite one of about 20 years, which is a different thing for QoS compatibility matching — a subscription requesting a 20 year deadline no longer matches a publisher offering an infinite one. Seconds in [2^31, 2^32) are worse: they wrap negative, produce a negative Duration, and QoS::deadline() throws rmw_time_t cannot be negative.

rclcpp::Duration::from_rmw_time() already does this conversion correctly — it saturates at INT64_MAX instead of wrapping — and it is what the QoS::deadline(), QoS::lifespan() and QoS::liveliness_lease_duration() getters use. This PR makes the helper use it too.

For every rmw_time_t whose seconds fit in an int32_t the two expressions produce the same number, so nothing changes for ordinary durations. The function is inline and lives in rclcpp::detail, so no public signature moves.

Fixes # (no issue filed; found while reading the QoS override code)

Is this user-facing behavior change?

Yes, for one case that is currently broken. A QoS profile with an infinite deadline, lifespan or liveliness_lease_duration keeps that infinite value when the corresponding parameter override is declared, instead of being silently reduced to ~292 years... in practice 633437444854775807 ns, about 20 years. Profiles whose durations already fit in an int32_t number of seconds are unchanged.

Did you use Generative AI?

Yes. Claude Opus 5, through Claude Code, found the truncation, wrote the one-line change in qos_parameters.hpp, wrote the declare_infinite_durations test in test_qos_parameters.cpp, and drafted this description. The build and test verification below was run afterwards and is reported exactly as the container printed it.

Additional Information

Verification. My earlier note said I could not build the full ROS 2 stack. That is now done, in the official ros:rolling-ros-base image with the test dependencies installed by rosdep. Environment: Ubuntu 26.04.1, ROS 2 Rolling, gcc 15.2.0, cmake 4.2.3. Base: e47c084 on rolling.

With this change applied, colcon build --packages-select rclcpp succeeds and the test file passes:

build : OK
test_qos_parameters.gtest.xml : total=8 failures=0 errors=0
  declare_infinite_durations                   passed

Then I reverted only rclcpp/include/rclcpp/detail/qos_parameters.hpp, keeping the new test, rebuilt, and it fails on current rolling:

build : OK
test_qos_parameters.gtest.xml : total=8 failures=1 errors=0
  declare_infinite_durations                   FAILED
    test_qos_parameters.cpp:218
    Expected equality of these values:
      infinite_ns                              Which is: 9223372036854775807
      rclcpp::detail::get_default_qos_param_value(
        rclcpp::QosPolicyKind::Deadline, qos).get<int64_t>()
                                               Which is: 633437444854775807

That is the truncated value predicted above, produced by the code as it stands today. The other seven tests in the file pass on both sides.

@fujitatomoya fujitatomoya left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I could not build the full ROS 2 stack here

why? can you take a look at https://docs.ros.org/en/rolling/Get-Started/Installation/Alternatives/Ubuntu-Development-Setup.html

IMO this looks good, but we are not going to approve that is NOT verified, we are not sure if this can be built without error.

Comment thread rclcpp/test/rclcpp/test_qos_parameters.cpp Outdated
@fujitatomoya

Copy link
Copy Markdown
Collaborator

and please use our pull request template.

@Dev-next-gen

Copy link
Copy Markdown
Author

Thanks, that was a fair objection — I should not have opened it unverified.

I built and tested it. Official ros:rolling-ros-base image, test dependencies installed with rosdep, Ubuntu 26.04.1, gcc 15.2.0, cmake 4.2.3, base e47c084 on rolling.

With the change, colcon build --packages-select rclcpp succeeds and test_qos_parameters passes 8/8. I then reverted only qos_parameters.hpp, kept the new test, and rebuilt: it fails on current rolling with

Expected equality of these values:
  infinite_ns   Which is: 9223372036854775807
  get_default_qos_param_value(QosPolicyKind::Deadline, qos).get<int64_t>()
                Which is: 633437444854775807

which is the truncated value the description predicts. The other seven tests pass on both sides. Full output is in the updated description.

I also rewrote the description using the ros2 template, including the Generative AI section.

@fujitatomoya

fujitatomoya commented Sep 14, 2026 •

Copy link
Copy Markdown
Collaborator

Pulls: #3268
Gist: https://gist.githubusercontent.com/fujitatomoya/5ea2889b313356c71d55e309debbc86e/raw/c1f7b08316468ca2bcc9c53e2276b22f4a804451/ros2.repos
BUILD args: --packages-above-and-dependencies rclcpp
TEST args: --packages-above rclcpp
ROS Distro: rolling
Job: ci_launcher
ci_launcher ran: https://ci.ros2.org/job/ci_launcher/20450

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Linux-rhel Build Status
  • Windows Build Status

@Dev-next-gen

Copy link
Copy Markdown
Author

Thanks for kicking off the full CI, appreciated.

Quick recap of where this stands so it's easy to pick back up: the change is verified on my side (official ros:rolling image, colcon build --packages-select rclcpp green, test_qos_parameters 8/8), and the new test fails on rolling without the fix with the truncated 633437444854775807 ns, as expected. The GitHub checks here — DCO, and the ABI build/diff on both base and PR — are all green, and the description follows the template, including the user-facing-behavior-change section.

It's been a couple of weeks, so if it helps I'm happy to rebase on current rolling to refresh the branch and let the CI re-run cleanly — just say the word. And if anything in your ci.ros2.org run needs addressing, point me at it and I'll take care of it.

Found by a defect-hunting pipeline I build and run (Dev-next-gen), using Claude Code with Anthropic's Claude Opus 5.

@fujitatomoya

Copy link
Copy Markdown
Collaborator

@Mergifyio rebase

@mergify

mergify Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

rebase

❌ This pull request comes from a fork and cannot be rebased

Details

GitHub refuses an OAuth token on its rebase API for a fork, so rebasing one means impersonating a GitHub user to force-push the contributor's branch. Mergify does not do that.

Use the update action or the @mergifyio update command instead: it brings the pull request up to date by merging the base branch into it, and needs no impersonation. It only has something to do when the pull request is behind its base branch, so if what the branch needs is a linear history, its author has to rebase it themselves.

@fujitatomoya

fujitatomoya commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

@Dev-next-gen can you rebase against the rolling? the thing is that, we removed some package dependencies recently, so without rebasing, it will fail to build. i need to rerun the whole ci after rebase.

rclcpp::detail::rmw_duration_to_int64_t built an rclcpp::Duration from
static_cast<int32_t>(rmw_duration.sec). RMW_DURATION_INFINITE, and the
best-available deadline and liveliness lease sentinels, all carry
9223372036 seconds, so the cast wrapped and the helper returned
633437444854775807 ns instead of 9223372036854775807 ns.

That value is what declare_qos_parameters() declares as the default for
the deadline, lifespan and liveliness_lease_duration overrides, and it is
fed straight back into the profile through apply_qos_override(). Enabling
those overrides on a profile carrying an infinite duration therefore
silently replaced it with a finite ~20 year duration, which changes QoS
compatibility matching. Seconds values in [2^31, 2^32) wrap to a negative
int32_t and produce a negative duration, which QoS::deadline() then
rejects with "rmw_time_t cannot be negative".

Use rclcpp::Duration::from_rmw_time(), which is the conversion the QoS
getters already use and which saturates instead of wrapping.

Signed-off-by: leoca <leo.camus23@gmail.com>
Signed-off-by: leoca <leo.camus23@gmail.com>
@Dev-next-gen
Dev-next-gen force-pushed the fix/qos-override-default-rmw-duration-narrowing branch from ec6a61d to 32ae0e7 Compare October 7, 2026 00:15
@Dev-next-gen

Copy link
Copy Markdown
Author

@fujitatomoya I will do

@Dev-next-gen

Copy link
Copy Markdown
Author

Rebased onto current rolling (6c66f377). The two commits applied cleanly, no conflicts: #3249 had touched test_qos_parameters.cpp since, but in different hunks, so the diff is unchanged (same two files, +50/−4) and both commits keep their DCO sign-off.

One honest caveat: I did not rebuild after this rebase on my side, so the CI run you mentioned is the real check here. Ready whenever you want to relaunch it.

Found by a defect-hunting pipeline I build and run (Dev-next-gen), using Claude Code with Anthropic's Claude Opus 5.

@fujitatomoya

Copy link
Copy Markdown
Collaborator

Pulls: #3268
Gist: https://gist.githubusercontent.com/fujitatomoya/13a96908897288a37f409d86f643c2db/raw/b048d5274ef085275b24ae06989edb91da336aad/ros2.repos
BUILD args: --packages-above-and-dependencies rclcpp
TEST args: --packages-above rclcpp
ROS Distro: rolling
Job: ci_launcher
ci_launcher ran: https://ci.ros2.org/job/ci_launcher/20728

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Linux-rhel Build Status
  • Windows Build Status

@github-actions

Copy link
Copy Markdown

ABI Compliance Check

❌ Verdict: incompatible

Library Verdict Summary
libcomponent_manager.so ❌ incompatible ABI-incompatible changes detected.
librclcpp.so ❌ incompatible ABI-incompatible changes detected.
librclcpp_action.so ✅ compatible No ABI changes detected.
librclcpp_lifecycle.so ❌ incompatible ABI-incompatible changes detected.
❌ libcomponent_manager.so — full abidiff report

Compared:

  • Base: lib-base/libcomponent_manager.so
  • Head: lib-pr/libcomponent_manager.so @ 32ae0e7
Functions changes summary: 6 Removed (84 filtered out), 3 Changed (102 filtered out), 0 Added (30 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
Function symbols changes summary: 27 Removed, 15 Added function symbols not referenced by debug info
Variable symbols changes summary: 24 Removed, 0 Added variable symbols not referenced by debug info

6 Removed functions:

  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv18ListNodes_Request_ISaIvEEERNS2_19ListNodes_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv17LoadNode_Request_ISaIvEEERNS2_18LoadNode_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&>(std::function<void(const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN22composition_interfaces3srv19UnloadNode_Request_ISaIvEEERNS2_20UnloadNode_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::ListNodes_Request_<std::allocator<void> >&, composition_interfaces::srv::ListNodes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv18ListNodes_Request_ISaIvEEERNS5_19ListNodes_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::LoadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::LoadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv17LoadNode_Request_ISaIvEEERNS5_18LoadNode_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const composition_interfaces::srv::UnloadNode_Request_<std::allocator<void> >&, composition_interfaces::srv::UnloadNode_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN22composition_interfaces3srv19UnloadNode_Request_ISaIvEEERNS5_20UnloadNode_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}

3 functions with some indirect sub-type change:

  [C] 'method void rclcpp::Service<composition_interfaces::srv::ListNodes>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<composition_interfaces::srv::ListNodes>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN22composition_interfaces3srv9ListNodesEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN22composition_interfaces3srv9ListNodesEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<composition_interfaces::srv::ListNodes>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<composition_interfaces::srv::ListNodes>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<composition_interfaces::srv::LoadNode>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<composition_interfaces::srv::LoadNode>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN22composition_interfaces3srv8LoadNodeEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN22composition_interfaces3srv8LoadNodeEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<composition_interfaces::srv::LoadNode>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<composition_interfaces::srv::LoadNode>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<composition_interfaces::srv::UnloadNode>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<composition_interfaces::srv::UnloadNode>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN22composition_interfaces3srv10UnloadNodeEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN22composition_interfaces3srv10UnloadNodeEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<composition_interfaces::srv::UnloadNode>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<composition_interfaces::srv::UnloadNode>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

27 Removed function symbols not referenced by debug info:

  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv10UnloadNodeEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_19UnloadNode_Request_ISaIvEEERNS2_20UnloadNode_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv10UnloadNodeEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_19UnloadNode_Request_ISaIvEEERNS2_20UnloadNode_Response_ISB_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv8LoadNodeEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_17LoadNode_Request_ISaIvEEERNS2_18LoadNode_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv8LoadNodeEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_17LoadNode_Request_ISaIvEEERNS2_18LoadNode_Response_ISB_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv9ListNodesEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_18ListNodes_Request_ISaIvEEERNS2_19ListNodes_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN22composition_interfaces3srv9ListNodesEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_18ListNodes_Request_ISaIvEEERNS2_19ListNodes_Response_ISB_EEEEEEDaS6_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS11_St17integral_constantImLm6EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS2_St17integral_constantImLm0EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSF_St17integral_constantImLm1EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSJ_St17integral_constantImLm2EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSL_St17integral_constantImLm3EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSS_St17integral_constantImLm4EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv17LoadNode_Request_ISaIvEEEES4_INS6_18LoadNode_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8LoadNodeEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSX_St17integral_constantImLm5EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS11_St17integral_constantImLm6EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS2_St17integral_constantImLm0EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSF_St17integral_constantImLm1EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSJ_St17integral_constantImLm2EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSL_St17integral_constantImLm3EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN22composition_interfaces3srv18ListNodes_Request_ISaIvEEEES4_INS6_19ListNodes_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_9ListNodesEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSS_St17integral_constantImLm4EEEEDaS15_S16_
  [D] _ZZNSt8__detail9_
... (report truncated; see the full report in the workflow run artifacts)
❌ librclcpp.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp.so
  • Head: lib-pr/librclcpp.so @ 32ae0e7
Functions changes summary: 18 Removed (142 filtered out), 8 Changed (219 filtered out), 0 Added (32 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
Function symbols changes summary: 16 Removed, 0 Added function symbols not referenced by debug info
Variable symbols changes summary: 72 Removed, 0 Added variable symbols not referenced by debug info

18 Removed functions:

  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv27DescribeParameters_Request_ISaIvEEERNS2_28DescribeParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv24GetLoggerLevels_Request_ISaIvEEERNS2_25GetLoggerLevels_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv26GetParameterTypes_Request_ISaIvEEERNS2_27GetParameterTypes_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv22GetParameters_Request_ISaIvEEERNS2_23GetParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv23ListParameters_Request_ISaIvEEERNS2_24ListParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv24SetLoggerLevels_Request_ISaIvEEERNS2_25SetLoggerLevels_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv32SetParametersAtomically_Request_ISaIvEEERNS2_33SetParametersAtomically_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&>(std::function<void(const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14rcl_interfaces3srv22SetParameters_Request_ISaIvEEERNS2_23SetParameters_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::DescribeParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::DescribeParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv27DescribeParameters_Request_ISaIvEEERNS5_28DescribeParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv24GetLoggerLevels_Request_ISaIvEEERNS5_25GetLoggerLevels_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetParameterTypes_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameterTypes_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv26GetParameterTypes_Request_ISaIvEEERNS5_27GetParameterTypes_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::GetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::GetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv22GetParameters_Request_ISaIvEEERNS5_23GetParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::ListParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::ListParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv23ListParameters_Request_ISaIvEEERNS5_24ListParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::SetLoggerLevels_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetLoggerLevels_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv24SetLoggerLevels_Request_ISaIvEEERNS5_25SetLoggerLevels_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::SetParametersAtomically_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParametersAtomically_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv32SetParametersAtomically_Request_ISaIvEEERNS5_33SetParametersAtomically_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const rcl_interfaces::srv::SetParameters_Request_<std::allocator<void> >&, rcl_interfaces::srv::SetParameters_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14rcl_interfaces3srv22SetParameters_Request_ISaIvEEERNS5_23SetParameters_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const type_description_interfaces__srv__GetTypeDescription_Request&, type_description_interfaces__srv__GetTypeDescription_Response&>(std::function<void(const rmw_request_id_s&, const type_description_interfaces__srv__GetTypeDescription_Request&, type_description_interfaces__srv__GetTypeDescription_Response&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRK60type_description_interfaces__srv__GetTypeDescription_RequestR61type_description_interfaces__srv__GetTypeDescription_ResponseEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const type_description_interfaces__srv__GetTypeDescription_Request&, type_description_interfaces__srv__GetTypeDescription_Response&>(std::function<void(const type_description_interfaces__srv__GetTypeDescription_Request&, type_description_interfaces__srv__GetTypeDescription_Response&)>)'    {_ZN10tracetools10get_symbolIvJRK60type_description_interfaces__srv__GetTypeDescription_RequestR61type_description_interfaces__srv__GetTypeDescription_ResponseEEEPcSt8functionIFT_DpT0_EE}

8 functions with some indirect sub-type change:

  [C] 'method void rclcpp::Service<rcl_interfaces::srv::DescribeParameters>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<rcl_interfaces::srv::DescribeParameters>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14rcl_interfaces3srv18DescribeParametersEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN14rcl_interfaces3srv18DescribeParametersEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<rcl_interfaces::srv::DescribeParameters>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<rcl_interfaces::srv::DescribeParameters>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<rcl_interfaces::srv::GetLoggerLevels>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<rcl_interfaces::srv::GetLoggerLevels>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14rcl_interfaces3srv15GetLoggerLevelsEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN14rcl_interfaces3srv15GetLoggerLevelsEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<rcl_interfaces::srv::GetLoggerLevels>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<rcl_interfaces::srv::GetLoggerLevels>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<rcl_interfaces::srv::GetParameterTypes>::Service(std::shared_ptr<rcl_node_s>, const std::string&, rclcpp::AnyServiceCallback<rcl_interfaces::srv::GetParameterTypes>, rcl_service_options_t&)' at service.hpp:260:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14rcl_interfaces3srv17GetParameterTypesEEC2ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
     and it aliases symbol: _ZN6rclcpp7ServiceIN14rcl_interfaces3srv17GetParameterTypesEEC1ESt10shared_ptrI10rcl_node_sERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_18AnyServiceCallbackIS3_EER21rcl_service_options_s
    implicit parameter 0 of type 'rclcpp::Service<rcl_interfaces::srv::GetParameterTypes>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<rcl_interfaces::srv::GetParameterTypes>' at service
... (report truncated; see the full report in the workflow run artifacts)
✅ librclcpp_action.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp_action.so
  • Head: lib-pr/librclcpp_action.so @ 32ae0e7
(empty report — no differences printed by abidiff)
❌ librclcpp_lifecycle.so — full abidiff report

Compared:

  • Base: lib-base/librclcpp_lifecycle.so
  • Head: lib-pr/librclcpp_lifecycle.so @ 32ae0e7
Functions changes summary: 8 Removed (116 filtered out), 4 Changed (224 filtered out), 0 Added (44 filtered out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
Function symbols changes summary: 36 Removed, 20 Added function symbols not referenced by debug info
Variable symbols changes summary: 32 Removed, 0 Added variable symbols not referenced by debug info

8 Removed functions:

  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv20ChangeState_Request_ISaIvEEERNS2_21ChangeState_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv27GetAvailableStates_Request_ISaIvEEERNS2_28GetAvailableStates_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv32GetAvailableTransitions_Request_ISaIvEEERNS2_33GetAvailableTransitions_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&>(std::function<void(const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRKN14lifecycle_msgs3srv17GetState_Request_ISaIvEEERNS2_18GetState_Response_IS4_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::ChangeState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::ChangeState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv20ChangeState_Request_ISaIvEEERNS5_21ChangeState_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableStates_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableStates_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv27GetAvailableStates_Request_ISaIvEEERNS5_28GetAvailableStates_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetAvailableTransitions_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetAvailableTransitions_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv32GetAvailableTransitions_Request_ISaIvEEERNS5_33GetAvailableTransitions_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}
  [D] 'function char* tracetools::get_symbol<void, const rmw_request_id_s&, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&>(std::function<void(const rmw_request_id_s&, const lifecycle_msgs::srv::GetState_Request_<std::allocator<void> >&, lifecycle_msgs::srv::GetState_Response_<std::allocator<void> >&)>)'    {_ZN10tracetools10get_symbolIvJRK16rmw_request_id_sRKN14lifecycle_msgs3srv17GetState_Request_ISaIvEEERNS5_18GetState_Response_IS7_EEEEEPcSt8functionIFT_DpT0_EE}

4 functions with some indirect sub-type change:

  [C] 'method void rclcpp::Service<lifecycle_msgs::srv::ChangeState>::Service(const std::shared_ptr<rcl_node_s>&, rcl_service_t*, rclcpp::AnyServiceCallback<lifecycle_msgs::srv::ChangeState>)' at service.hpp:357:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv11ChangeStateEEC2ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
     and it aliases symbol: _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv11ChangeStateEEC1ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
    implicit parameter 0 of type 'rclcpp::Service<lifecycle_msgs::srv::ChangeState>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<lifecycle_msgs::srv::ChangeState>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<lifecycle_msgs::srv::GetAvailableStates>::Service(const std::shared_ptr<rcl_node_s>&, rcl_service_t*, rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetAvailableStates>)' at service.hpp:357:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv18GetAvailableStatesEEC2ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
     and it aliases symbol: _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv18GetAvailableStatesEEC1ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
    implicit parameter 0 of type 'rclcpp::Service<lifecycle_msgs::srv::GetAvailableStates>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<lifecycle_msgs::srv::GetAvailableStates>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<lifecycle_msgs::srv::GetAvailableTransitions>::Service(const std::shared_ptr<rcl_node_s>&, rcl_service_t*, rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetAvailableTransitions>)' at service.hpp:357:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv23GetAvailableTransitionsEEC2ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
     and it aliases symbol: _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv23GetAvailableTransitionsEEC1ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
    implicit parameter 0 of type 'rclcpp::Service<lifecycle_msgs::srv::GetAvailableTransitions>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<lifecycle_msgs::srv::GetAvailableTransitions>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

  [C] 'method void rclcpp::Service<lifecycle_msgs::srv::GetState>::Service(const std::shared_ptr<rcl_node_s>&, rcl_service_t*, rclcpp::AnyServiceCallback<lifecycle_msgs::srv::GetState>)' at service.hpp:357:1 has some indirect sub-type changes:
    Please note that the symbol of this function is _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv8GetStateEEC2ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
     and it aliases symbol: _ZN6rclcpp7ServiceIN14lifecycle_msgs3srv8GetStateEEC1ERKSt10shared_ptrI10rcl_node_sEP13rcl_service_sNS_18AnyServiceCallbackIS3_EE
    implicit parameter 0 of type 'rclcpp::Service<lifecycle_msgs::srv::GetState>*' has sub-type changes:
      in pointed to type 'class rclcpp::Service<lifecycle_msgs::srv::GetState>' at service.hpp:231:1:
        type size hasn't changed
        no base class change (1 filtered);
        no member function changes (6 filtered);
        no data member change (1 filtered);

36 Removed function symbols not referenced by debug info:

  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv11ChangeStateEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_20ChangeState_Request_ISaIvEEERNS2_21ChangeState_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv11ChangeStateEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_20ChangeState_Request_ISaIvEEERNS2_21ChangeState_Response_ISB_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv18GetAvailableStatesEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_27GetAvailableStates_Request_ISaIvEEERNS2_28GetAvailableStates_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv18GetAvailableStatesEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_27GetAvailableStates_Request_ISaIvEEERNS2_28GetAvailableStates_Response_ISB_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv23GetAvailableTransitionsEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_32GetAvailableTransitions_Request_ISaIvEEERNS2_33GetAvailableTransitions_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv23GetAvailableTransitionsEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_32GetAvailableTransitions_Request_ISaIvEEERNS2_33GetAvailableTransitions_Response_ISB_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv8GetStateEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRK16rmw_request_id_sRKNS2_17GetState_Request_ISaIvEEERNS2_18GetState_Response_ISE_EEEEEEDaS6_
  [D] _ZZN6rclcpp18AnyServiceCallbackIN14lifecycle_msgs3srv8GetStateEE29register_callback_for_tracingEvENKUlOT_E_clIRSt8functionIFvRKNS2_17GetState_Request_ISaIvEEERNS2_18GetState_Response_ISB_EEEEEEDaS6_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS11_St17integral_constantImLm6EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRS2_St17integral_constantImLm0EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSF_St17integral_constantImLm1EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSJ_St17integral_constantImLm2EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSL_St17integral_constantImLm3EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSS_St17integral_constantImLm4EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv17GetState_Request_ISaIvEEEES4_INS6_18GetState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_8GetStateEEEESH_SA_EES3_IFvRKS9_RSC_EES3_IFvRKSG_SU_SV_EEEEaSEOS12_ENUlOT_T0_E_clIRSX_St17integral_constantImLm5EEEEDaS15_S16_
  [D] _ZZNSt8__detail9__variant17_Move_assign_baseILb0EJSt9monostateSt8functionIFvSt10shared_ptrIN14lifecycle_msgs3srv20ChangeState_Request_ISaIvEEEES4_INS6_21ChangeState_Response_IS8_EEEEES3_IFvS4_I16rmw_request_id_sESA_SD_EES3_IFvSH_SA_EES3_IFvS4_IN6rclcpp7ServiceINS6_11ChangeStateEEEESH_SA_EES3_IFvRKS9_RS
... (report truncated; see the full report in the workflow run artifacts)

Updated for commit 32ae0e7 · suppressions: /home/runner/work/_temp/ros2-abi-suppressions.txt

@Dev-next-gen

Copy link
Copy Markdown
Author

The ABI workflow is configured right for this case: policy: auto makes rolling advisory under REP-0009, so all four abi / diff jobs report pass and nothing here is actually blocked. The ❌ in the comment body is still worth a note, because it is not produced by this PR.

I saved the report body posted here and the one posted on #3299, normalised only the commit sha each one carries, and got the same file:

0f429c225f4a9efe8f368ea00a81850d  abi-3268.txt
0f429c225f4a9efe8f368ea00a81850d  abi-3299.txt

#3299 changes exactly one file, rclcpp/test/rclcpp/test_subscription.cpp, +54/−0, and abi.yaml builds the libraries with BUILD_TESTING=OFF, so no test file reaches what abidiff compares. The 258 lines are identical anyway: same three libraries flagged, same 6 Removed (84 filtered out), 3 Changed (102 filtered out) for libcomponent_manager.so, same removals — 32 tracetools::get_symbol<...> instantiations, 21 std::__detail::__variant::_Move_assign_base<...> lambdas, all coming from service.hpp / AnyServiceCallback. Nothing from my diff shows up in it either: grepping the whole report for rmw_duration_to_int64_t, qos_parameters or from_rmw_time returns 0 hits. My change is one line inside one inline function in rclcpp::detail, plus a test. #3315 is the same baseline with its own real symbols added on top, which is why its counts are slightly higher.

What I have not worked out is why the base build and the head build disagree on those COMDAT symbols to begin with, so I can't give you the cause — only the fact that the identical disagreement shows up on a PR that cannot change the ABI at all.

Found by a defect-hunting pipeline I build and run (Dev-next-gen), using Claude Code with Anthropic's Claude Opus 5.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants