Как я могу заставить clang-tidy не жаловаться на передачу легковесных типов по значению?

CLion (2023.1.2) использует clang-tidy v17 для моего проекта. Он жалуется на то, что я передаю std::experimental::optional (из С++ 14) по значению, а не по ссылке. Это кажется мне вопиющим ... как я могу увеличить «порог веса объекта» для выявления аккуратных жалоб на копирование?

Точное описание проблемы:

Clang-Tidy: параметр «независимо» копируется для каждого вызова, но используется только как константная ссылка; подумайте о том, чтобы сделать его константной ссылкой

Примечание. В отличие от этого вопроса, я хочу изменить порог clang-tidy, а не внести в белый список определенную строку кода или определенный тип.

У меня есть только clang-tidy 16, и он не жалуется на меня. Это новое в v17? Кстати, sizeof(std::optional<unsigned>) на моей машине стоит 8.

Ted Lyngmo 23.05.2023 23:14

@TedLyngmo: Может быть, это особенность С++ 14. Я ограничу вопрос. Кроме того, размер имеет смысл, потому что он должен быть больше 4, чтобы вместить nullopt, а размер 5 или 6 был бы странным и проблематичным с точки зрения производительности.

ein supports Moderator Strike 24.05.2023 00:02

Ага. Что ж, я понимаю это при использовании std::experimental::optional как в режиме C++14, так и в режиме C++20, а использование std::optional в C++20 не вызывает таких жалоб.

Ted Lyngmo 24.05.2023 00:09

Я также пытаюсь понять код clang-tidy. Не могу найти способ отключить его с помощью ограничения веса, но это не простой для чтения код. В нем говорится: «Не предлагать исправления, когда: 1. ParmVarDecl находится в макросе, поскольку мы не можем правильно разместить их, 2. функция является виртуальной, поскольку она может нарушить переопределение, 3. на функцию ссылаются вне выражения вызова в пределах единица компиляции, поскольку изменение подписи может привести к ошибкам сборки, 4. функция является основным шаблоном или явной специализацией шаблона», но не упоминает порог размера или что-то подобное.

Ted Lyngmo 24.05.2023 00:13

Приведенные выше комментарии взяты из clang-tidy/performance/UnnecessaryValueParamCheck.cpp кстати

Ted Lyngmo 24.05.2023 00:18

@TedLyngmo: Итак, похоже, вы говорите, что такого ограничения нет, и, возможно, мне следует сообщить об ошибке. Но - вы заметили, по какому критерию они предупреждают? Я тоже завтра пойду читать.

ein supports Moderator Strike 24.05.2023 00:40

Да, это все, что я понял, прежде чем мне пришлось самому лечь спать :-) Приятно, что ecatmur нашел причину, и, возможно, отчет об ошибке / запрос на улучшение были бы уместны.

Ted Lyngmo 24.05.2023 08:19
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Clang-tidy check «performance-unnecessary-value-param» ищет типы аргументов, которые удовлетворяют предикату «isExpensiveToCopy», который является довольно простым тестом для нетривиальных типов:

  return !Type.isTriviallyCopyableType(Context) &&
         !classHasTrivialCopyAndDestroy(Type) &&
         !hasDeletedCopyConstructor(Type) &&
         !Type->isObjCLifetimeType();

Это разумно в вашем случае, потому что TS std::experimental::Optional не распространяет тривиальную возможность копирования из своего параметра, тогда как std::Optional делает:

void f(std::optional<int>) {} // does not warn, because:
static_assert(std::is_trivially_copyable_v<std::optional<int>>);

void f(std::experimental::optional<int>) {} // warns, because:
static_assert(not std::is_trivially_copyable_v<std::experimental::optional<int>>);

Тест несколько наивен; оптимизатор может исключить конструктор копирования std::experimental::optional<int>. Но порога «веса» нет. Действительно, проверка не предупреждает о std::array<int, 1024>:

void f(std::array<int, 1024>) {} // does not warn, because:
static_assert(std::is_trivially_copyable_v<std::array<int, 1024>>);

Демо .

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

Похожие вопросы