Сравнение целых чисел разных знаков предупреждения с Xcode - PullRequest
6 голосов
/ 02 декабря 2011

Я использую открытый исходный код для сборки своего проекта. когда я добавляю EGOTextView к проекту, у него появляются семантические проблемы, такие как:


Comparison of integers of different signs: 'int' and 'NSUInteger' (aka 'unsigned long')
Comparison of integers of different signs: 'NSInteger' (aka 'long') and 'NSUInteger' (aka 'unsigned long')

Например, в исходном коде:


     for (int i = 0; i &lt lines.count; i++)//lines is an array

Я заметил, что у проекта есть файл конфигурации сборки, который включает в себя:

// Make CG and NS geometry types be the same. Mostly doesn't matter on iPhone, but this also makes NSInteger types be defined based on 'long' consistently, which avoids conflicting warnings from clang + llvm 2.7 about printf format checking

OTHER_CFLAGS = $(value) -DNS_BUILD_32_LIKE_64

Судя по комментариям, я думаю, это вызывает проблемы. Тем не менее, я не знаю значения этого параметра OTHER_CFLAGS. И я также не знаю, как это исправить, чтобы избежать семантических проблем.

Может ли кто-нибудь мне помочь?

Спасибо!

Ответы [ 4 ]

24 голосов
/ 12 декабря 2013

На самом деле, я не думаю, что отключение предупреждения компилятора - правильное решение, поскольку сравнение int и unsigned long приводит к незначительной ошибке.

Например:

unsigned int a = UINT_MAX; // 0xFFFFFFFFU == 4,294,967,295 
signed int b = a; // 0xFFFFFFFF == -1

for (int i = 0; i < b; ++i)
{
    // the loop will have zero iterations because i < b is always false!
}

В основном, если вы просто отбрасываете (неявно или явно) unsigned int на int, ваш код будет работать неправильно, если значение вашего unsigned int больше, чем INT_MAX.

Правильное решение - привести signed int к unsigned int, а также сравнить signed int с нулем, покрывая случай, когда он отрицательный:

unsigned int a = UINT_MAX; // 0xFFFFFFFFU == 4,294,967,295 

for (int i = 0; i < 0 || (unsigned)i < a; ++i)
{
    // The loop will have UINT_MAX iterations
}
6 голосов
/ 04 февраля 2014

Вместо того, чтобы выполнять все это странное приведение типов повсеместно, вы должны сначала заметить, почему вы сравниваете различные типы в первую очередь: ВЫ СОЗДАЕТЕ INT! !!

сделать это вместо:

    for (unsigned long i = 0; i < lines.count; i++)//lines is an array

... и теперь вы сравниваете одни и те же типы!

4 голосов
/ 02 декабря 2011

Опция конфигурации, на которую вы смотрите, ничего не сделает с указанным вами предупреждением.Что вам нужно сделать, это зайти в настройки сборки и найти предупреждение «Сравнение знаков».Выключи это.

enter image description here

3 голосов
/ 13 сентября 2012

Вместо того, чтобы включать предупреждения, вы также можете предотвратить их появление.

Ваш lines.count имеет тип NSUInteger.Сначала сделайте int этого, а затем сделайте сравнение:

int count = lines.count;
for (int i = 0; i < count; i++)
...