Управление Предупреждениями Clang

я скомпилировал источник объединения SQLite в свой проект iOS и clang бросает предупреждение на этой строке

mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff;

со следующим предупреждением:

Implicit conversion from 'long long' to 'long' changes value from
9223372036854775807 to -1
[warn_impcast_integer_precision_constant]

Я включен -fdiagnostics-show-name показать имя (warn_impcast_integer_precision_constant).

Я, конечно, не хочу ничего менять в источнике SQLite, так как я не хочу вводить непредвиденные побочные эффекты, поэтому я хотел бы отключить это конкретное предупреждение только для этой одной строки. Предупреждение, конечно, справедливо, но не может произойти в любом случае с sizeof проверить на месте.

чтобы сделать этот процесс воспроизводимым для других предупреждений и диагностики, есть ли способ узнать конкретный класс предупреждений и отключить их для одной строки? К сожалению, я не могу найти ничего в так называемом clang/llvm "документация".

3 ответов


любая удаленная последняя версия clang должна печатать флаг, связанный с данным предупреждением вместе с предупреждением (в этом случае-wconstant-conversion); не уверен, почему вы этого не видите. И чтобы отключить его, вы можете использовать #pragma clang diagnostic ignored "-Wconstant-conversion".


цитата из инструкции выложены сэром Крисом Lattner:

в приведенном ниже примере-Wmultichar игнорируется только для одной строки кода, после чего диагностика возвращается в то состояние, которое ранее существовало.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char b = 'df'; // no warning.
#pragma clang diagnostic pop

но что более важно, не было бы более разумным рассмотреть тип переменной, которая является "маской", и что представляет собой "Маска"?

поскольку вы делаете что-то в зависимости от того, является ли размер long 8, должен ли он может быть типа uint64_t?

что, если sizeof (long) на самом деле 16 вместо 8 или 4 (что, я думаю, вы ожидаете, когда это не 8)? Может быть 0x7fffffff тогда еще маску вам нужно? Или, возможно, вы действительно хотите назначить LONG_MAX из пределов.h а не нынешняя конструкция.


руководство пользователя clang здесь: http://clang.llvm.org/docs/UsersManual.html

в нем обсуждаются различные темы, связанные с диагностикой. Есть другие полезные документы в боковой панелиhttp://clang.llvm.org/