Является ли приведение функции, возвращаемой к void, «приведением в старом стиле» или нет? - PullRequest
0 голосов
/ 26 ноября 2018

Coverity жаловался, что различные вызовы функций в нашей кодовой базе не проверяют возвращаемое значение.

Не проверенное возвращаемое значение (CHECKED_RETURN) 3.check_return: вызов метода Append без проверки возвращаемого значения (как это делается в другом месте 73 из 78 раз).

В прошлом мы бы просто решили эту проблему (после двойной проверки, что возвращаемое значение действительноне было важно), приведя возврат к void (как обсуждено здесь ):

(void)Foo.Append(bar);

Однако мы движемся к включению всех предупреждений, и обрабатывая предупреждения как ошибки, поэтому я немного обеспокоен тем, что приведенный выше код сгенерирует диагностику old-style-cast.Если это так, мне нужно изменить наш код на более уродливый формат:

static_cast<void>( Foo.Append(bar) );

Однако оба gcc и clang , похоже, способныскомпилируйте этот код ( первая форма) без жалоб.Итак, я полагаю, что последняя форма моего вопроса такова: считается ли приведение функции, возвращаемой к void, исключением из правила, если речь идет о приведениях в стиле C?Или мне нужно дважды проверить мой код и посмотреть, действительно ли рассматриваемые строки не включены в эти сборки?

1 Ответ

0 голосов
/ 26 ноября 2018

Все хорошо.

(void) f(x);

всегда эквивалентно static_cast согласно [expr.static.cast]/6:

Любое выражение может быть явно преобразованочтобы ввести cv void, в этом случае оно становится выражением отброшенного значения.

Преобразование результата функции в void - это способ сделать выражение a отбрасывания значение выражение .Теперь путь C ++ должен быть static_cast<void>(...), но (void) ... является идиомой (и короче).

Поскольку последний хорошо определен и действительно распространен в кодовых базах, gcc 1 и clang 2 сделал это не триггер Wold-style-cast.

Он четко определен, признан основными компиляторами.Это нормально.


1) g ++ документация --- 3.5 Параметры управления диалектом C ++

-Wold-style-cast (C ++и только Objective-C ++)
Предупреждать, если в программе на C ++ используется старый стиль (стиль C) , приведенный к не пустому типу .Приведения в новом стиле (dynamic_cast, static_cast, reinterpret_cast и const_cast) менее уязвимы для непреднамеренных эффектов и их гораздо легче найти.

2) не задокументировано

...