Неожиданное зацикливание в Objective C - PullRequest
0 голосов
/ 18 мая 2011

У меня есть этот код:

unsigned int k=(len - sizeof(MSG_INFO));
NSLog(@"%d",k);
for( unsigned int ix = 0; ix < k; ix++)
{
    m_pOutPacket->m_buffer[ix] = (char)(pbuf[ix + sizeof(MSG_INFO)]);
}

Проблема в том, когда:

len = 0 and sizeof(MSG_INFO)=68;
k=-68;

Это условие входит в цикл for и продолжается бесконечное время.

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Ваш код говорит: unsigned int k.Так что к не -68, это unsigned.Это делает ka очень большим числом, основанным на 4-байтовом int , это будет 4294967210. Это, очевидно, намного больше, чем 0, поэтому потребуется некоторое время для цикла for, чтобы получить этовысокий, хотя в конечном итоге он закончится.

Причина, по которой вы думаете, что это -86, заключается в том, что когда вы распечатываете его с помощью функции, подобной NSLog, он не имеет прямого знания об передаваемых аргументахопределяет, как обрабатывать аргументы, основываясь на строке формата, предоставленной в качестве первого аргумента.

Вы звоните: Это:

NSLog(@"%d",k); 

Это говорит NSLog трактовать аргумент как signed int (%d).Вы должны сделать это:

NSLog(@"%u",k); 

Так что NSLog рассматривает аргумент как тип, который он есть: unsigned (%u). См. Документацию NSLog.

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

После размышлений я считаю, что @FreeAsInBeer верен, и в этой ситуации вы не хотите выполнять итерацию по циклу for, и вы могли бы исправить это, используя подписанные целые числа.Тем не менее, мне кажется, что вам лучше было бы проверить len > sizeof(MSG_INFO) и, если это не так, обрабатывать это иначе.В большинстве ситуаций, о которых я могу думать, я не хотел бы выполнять какую-либо обработку после цикла for, если бы мне не удалось прочитать достаточно информации для сообщения ...

0 голосов
/ 18 мая 2011

Я не совсем уверен, что здесь происходит, так как цикл никогда не должен выполняться.Я загрузил ваш код, и похоже, что unsigned часть вашей декларации int вызывает проблемы.Если вы удалите оба ваших спецификатора unsigned, ваш код будет выполняться так, как должен, даже не входя в цикл.

...