Skip to content

Commit 37adc03

Browse files
authored
Fix -Wmaybe-uninitialized warning (#2081)
* Fix -Wmaybe-uninitialized warning gcc 12 warned about `callback_list_ptr` potentially being uninitialized when compiling in release mode (i.e., with `-O2`). Since `shutdown_type` is a compile-time parameter, we fix the warning by enforcing the decision at compile time. Signed-off-by: Alexander Hans <[email protected]>
1 parent 3db2ece commit 37adc03

File tree

2 files changed

+54
-65
lines changed

2 files changed

+54
-65
lines changed

rclcpp/include/rclcpp/context.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,20 +398,22 @@ class Context : public std::enable_shared_from_this<Context>
398398

399399
using ShutdownCallback = ShutdownCallbackHandle::ShutdownCallbackType;
400400

401+
template<ShutdownType shutdown_type>
401402
RCLCPP_LOCAL
402403
ShutdownCallbackHandle
403404
add_shutdown_callback(
404-
ShutdownType shutdown_type,
405405
ShutdownCallback callback);
406406

407+
template<ShutdownType shutdown_type>
407408
RCLCPP_LOCAL
408409
bool
409410
remove_shutdown_callback(
410-
ShutdownType shutdown_type,
411411
const ShutdownCallbackHandle & callback_handle);
412412

413+
template<ShutdownType shutdown_type>
414+
RCLCPP_LOCAL
413415
std::vector<rclcpp::Context::ShutdownCallback>
414-
get_shutdown_callback(ShutdownType shutdown_type) const;
416+
get_shutdown_callback() const;
415417
};
416418

417419
/// Return a copy of the list of context shared pointers.

rclcpp/src/rclcpp/context.cpp

Lines changed: 49 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -365,123 +365,110 @@ Context::on_shutdown(OnShutdownCallback callback)
365365
rclcpp::OnShutdownCallbackHandle
366366
Context::add_on_shutdown_callback(OnShutdownCallback callback)
367367
{
368-
return add_shutdown_callback(ShutdownType::on_shutdown, callback);
368+
return add_shutdown_callback<ShutdownType::on_shutdown>(callback);
369369
}
370370

371371
bool
372372
Context::remove_on_shutdown_callback(const OnShutdownCallbackHandle & callback_handle)
373373
{
374-
return remove_shutdown_callback(ShutdownType::on_shutdown, callback_handle);
374+
return remove_shutdown_callback<ShutdownType::on_shutdown>(callback_handle);
375375
}
376376

377377
rclcpp::PreShutdownCallbackHandle
378378
Context::add_pre_shutdown_callback(PreShutdownCallback callback)
379379
{
380-
return add_shutdown_callback(ShutdownType::pre_shutdown, callback);
380+
return add_shutdown_callback<ShutdownType::pre_shutdown>(callback);
381381
}
382382

383383
bool
384384
Context::remove_pre_shutdown_callback(
385385
const PreShutdownCallbackHandle & callback_handle)
386386
{
387-
return remove_shutdown_callback(ShutdownType::pre_shutdown, callback_handle);
387+
return remove_shutdown_callback<ShutdownType::pre_shutdown>(callback_handle);
388388
}
389389

390+
template<Context::ShutdownType shutdown_type>
390391
rclcpp::ShutdownCallbackHandle
391392
Context::add_shutdown_callback(
392-
ShutdownType shutdown_type,
393393
ShutdownCallback callback)
394394
{
395395
auto callback_shared_ptr =
396396
std::make_shared<ShutdownCallbackHandle::ShutdownCallbackType>(callback);
397397

398-
switch (shutdown_type) {
399-
case ShutdownType::pre_shutdown:
400-
{
401-
std::lock_guard<std::mutex> lock(pre_shutdown_callbacks_mutex_);
402-
pre_shutdown_callbacks_.emplace(callback_shared_ptr);
403-
}
404-
break;
405-
case ShutdownType::on_shutdown:
406-
{
407-
std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_);
408-
on_shutdown_callbacks_.emplace(callback_shared_ptr);
409-
}
410-
break;
398+
static_assert(
399+
shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
400+
401+
if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
402+
std::lock_guard<std::mutex> lock(pre_shutdown_callbacks_mutex_);
403+
pre_shutdown_callbacks_.emplace(callback_shared_ptr);
404+
} else {
405+
std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_);
406+
on_shutdown_callbacks_.emplace(callback_shared_ptr);
411407
}
412408

413409
ShutdownCallbackHandle callback_handle;
414410
callback_handle.callback = callback_shared_ptr;
415411
return callback_handle;
416412
}
417413

414+
template<Context::ShutdownType shutdown_type>
418415
bool
419416
Context::remove_shutdown_callback(
420-
ShutdownType shutdown_type,
421417
const ShutdownCallbackHandle & callback_handle)
422418
{
423-
std::mutex * mutex_ptr = nullptr;
424-
std::unordered_set<
425-
std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr;
426-
427-
switch (shutdown_type) {
428-
case ShutdownType::pre_shutdown:
429-
mutex_ptr = &pre_shutdown_callbacks_mutex_;
430-
callback_list_ptr = &pre_shutdown_callbacks_;
431-
break;
432-
case ShutdownType::on_shutdown:
433-
mutex_ptr = &on_shutdown_callbacks_mutex_;
434-
callback_list_ptr = &on_shutdown_callbacks_;
435-
break;
436-
}
437-
438-
std::lock_guard<std::mutex> lock(*mutex_ptr);
439-
auto callback_shared_ptr = callback_handle.callback.lock();
419+
const auto callback_shared_ptr = callback_handle.callback.lock();
440420
if (callback_shared_ptr == nullptr) {
441421
return false;
442422
}
443-
return callback_list_ptr->erase(callback_shared_ptr) == 1;
423+
424+
const auto remove_callback = [this, &callback_shared_ptr](auto & mutex, auto & callback_set) {
425+
const std::lock_guard<std::mutex> lock(mutex);
426+
return callback_set.erase(callback_shared_ptr) == 1;
427+
};
428+
429+
static_assert(
430+
shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
431+
432+
if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
433+
return remove_callback(pre_shutdown_callbacks_mutex_, pre_shutdown_callbacks_);
434+
} else {
435+
return remove_callback(on_shutdown_callbacks_mutex_, on_shutdown_callbacks_);
436+
}
444437
}
445438

446439
std::vector<rclcpp::Context::OnShutdownCallback>
447440
Context::get_on_shutdown_callbacks() const
448441
{
449-
return get_shutdown_callback(ShutdownType::on_shutdown);
442+
return get_shutdown_callback<ShutdownType::on_shutdown>();
450443
}
451444

452445
std::vector<rclcpp::Context::PreShutdownCallback>
453446
Context::get_pre_shutdown_callbacks() const
454447
{
455-
return get_shutdown_callback(ShutdownType::pre_shutdown);
448+
return get_shutdown_callback<ShutdownType::pre_shutdown>();
456449
}
457450

451+
template<Context::ShutdownType shutdown_type>
458452
std::vector<rclcpp::Context::ShutdownCallback>
459-
Context::get_shutdown_callback(ShutdownType shutdown_type) const
453+
Context::get_shutdown_callback() const
460454
{
461-
std::mutex * mutex_ptr = nullptr;
462-
const std::unordered_set<
463-
std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr;
464-
465-
switch (shutdown_type) {
466-
case ShutdownType::pre_shutdown:
467-
mutex_ptr = &pre_shutdown_callbacks_mutex_;
468-
callback_list_ptr = &pre_shutdown_callbacks_;
469-
break;
470-
case ShutdownType::on_shutdown:
471-
mutex_ptr = &on_shutdown_callbacks_mutex_;
472-
callback_list_ptr = &on_shutdown_callbacks_;
473-
break;
474-
}
455+
const auto get_callback_vector = [this](auto & mutex, auto & callback_set) {
456+
const std::lock_guard<std::mutex> lock(mutex);
457+
std::vector<rclcpp::Context::ShutdownCallback> callbacks;
458+
for (auto & callback : callback_set) {
459+
callbacks.push_back(*callback);
460+
}
461+
return callbacks;
462+
};
475463

476-
std::vector<rclcpp::Context::ShutdownCallback> callbacks;
477-
{
478-
std::lock_guard<std::mutex> lock(*mutex_ptr);
479-
for (auto & iter : *callback_list_ptr) {
480-
callbacks.emplace_back(*iter);
481-
}
482-
}
464+
static_assert(
465+
shutdown_type == ShutdownType::pre_shutdown || shutdown_type == ShutdownType::on_shutdown);
483466

484-
return callbacks;
467+
if constexpr (shutdown_type == ShutdownType::pre_shutdown) {
468+
return get_callback_vector(pre_shutdown_callbacks_mutex_, pre_shutdown_callbacks_);
469+
} else {
470+
return get_callback_vector(on_shutdown_callbacks_mutex_, on_shutdown_callbacks_);
471+
}
485472
}
486473

487474
std::shared_ptr<rcl_context_t>

0 commit comments

Comments
 (0)