Подтвердить что ты не робот

Контроль предупреждений Клана

Я скомпилировал источник слияния 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.

4b9b3361

Ответ 1

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

Ответ 2

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

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

#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 из limits.h, а не в текущую конструкцию.

Ответ 3

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

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