Неожиданное предупреждение «указатель равен нулю» в библиотеке boost asio?

Я компилирую проект, включающий библиотеку asio C++, и получаю неприятное предупреждение:

../opendnp3/_deps/asio-src/asio/include/asio/impl/connect.hpp:75:73: 
warning: ‘this’ pointer is null [-Wnonnull]
   75 |         (*static_cast<legacy_connect_condition_helper<T, Iterator>*>(0))(
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
   76 |           *static_cast<const asio::error_code*>(0),
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      
   77 |           *static_cast<const Iterator*>(0)))) != 1;
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     

В приведенном ниже коде файл asio Connect.hpp (строка 67)

template <typename T, typename Iterator>
struct is_legacy_connect_condition
{
  static char asio_connect_condition_check(char);
  static char (&asio_connect_condition_check(Iterator))[2];

  static const bool value =
  sizeof(asio_connect_condition_check(
    (*static_cast<legacy_connect_condition_helper<T, Iterator>*>(0))(
      *static_cast<const asio::error_code*>(0),
      *static_cast<const Iterator*>(0)))) != 1;
};

Я слишком новичок в шаблонах, чтобы диагностировать это предупреждение. Кто-нибудь сталкивался с этим и/или имел какое-либо представление о том, указывает ли это на реальную проблему и как я могу предотвратить предупреждение? (На самом деле существует несколько подобных предупреждений, что добавляет много беспорядка в вывод.) Спасибо.

Не уверен, что это то, что вам нужно, но -Wno-nonnull отключит это конкретное предупреждение.

NathanOliver 19.07.2024 17:04

Он находится в неоцененном контексте (внутри sizeof), так что это не проблема.

Jarod42 19.07.2024 17:12

Ускорение обновления. Начиная с версии 1.78 вместо этого используется static const bool value = sizeof(asio_connect_condition_check( (declval<legacy_connect_condition_helper<T, Iterator> >())(declval<const boost::system::error_code>(), declval<const Iterator>()))) != 1;.

Ted Lyngmo 19.07.2024 17:12

По моему мнению, лучший способ отключить это предупреждение — изменить процесс сборки таким образом, чтобы путь загрузки включался с помощью переключателя -isystem. Таким образом, предупреждения из заголовков повышения будут игнорироваться.

Marek R 19.07.2024 17:21
github.com/chriskohlhoff/asio/pull/882
Marek R 19.07.2024 17:26

No Non Null звучит как имя плохого парня, когда Стэн Ли писал комиксы о монстрах в 50-х годах.

user4581301 19.07.2024 17:30

Boost 1.85.0 — текущая версия Boost. Эта проблема была исправлена ​​в версии 1.78.0 (08 декабря 2021 г.). Какую версию Boost вы используете?

Eljay 20.07.2024 14:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это проверка того, является ли результат вызова legacy_connect_condition_helper<T, Iterator>Iterator или нет, что, в свою очередь, проверяет, является ли T функцией, которая принимает error_code и Iterator и возвращает Iterator.

Однако важно то, что не имеет значения, что указатели имеют значение null, поскольку sizeof — это неоцениваемый контекст. Имеют значение только задействованные типы; выражение не выполняется, и поэтому все эти разыменования нулевого указателя безопасны.

В более современном коде вы, вероятно, использовали бы std::declval вместо приведения нулевых указателей:

template <typename T, typename Iterator>
struct is_legacy_connect_condition
{
  static char asio_connect_condition_check(char);
  static char (&asio_connect_condition_check(Iterator))[2];

  static const bool value =
  sizeof(asio_connect_condition_check(
    (std::declval<legacy_connect_condition_helper<T, Iterator>>())(
      std::declval<const asio::error_code>(),
      std::declval<const Iterator>()))) != 1;
};

Но std::declval не был представлен до C++11. Asio довольно старый, и ему приходилось работать на старых компиляторах без поддержки C++11.


Что касается того, как избежать предупреждения, лучше всего обновиться до более новой версии asio. Нарушающий код был заменен версией declval в этом коммите три года назад и был выпущен как часть автономной версии asio 1.21.0 или boost 1.78.

Если по какой-то причине вы застряли на старой версии и используете GCC, вы можете добавить каталоги asio include в качестве системных (используйте -isystem вместо -I). Это отключит отчеты о предупреждениях для этих заголовков (в основном).

В противном случае вам придется глобально отключить предупреждение о ненулевых значениях. Либо прекратите передачу -Wnonnull, либо добавьте -Wno-nonnull (если ненулевое значение включено каким-либо другим предупреждающим флагом).

Другие вопросы по теме