Управление Clang Warnings - PullRequest
       4

Управление Clang Warnings

11 голосов
/ 18 сентября 2011

Я скомпилировал источник объединения 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 ]

16 голосов
/ 19 сентября 2011

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

1 голос
/ 08 мая 2013

, как указано в руководстве пользователя, выложенном сэром Крисом Латтнером:

В следующем примере -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 из limit.h, а не текущей конструкции.

0 голосов
/ 22 сентября 2011

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

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

есть другие полезные документы
...