Objective C中意外的循环

spa*_*ana 0 unsigned objective-c

我有这个代码:

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)]);
}
Run Code Online (Sandbox Code Playgroud)

问题是,当:

len = 0 and sizeof(MSG_INFO)=68;
k=-68;
Run Code Online (Sandbox Code Playgroud)

这个条件进入for循环并持续无限次.

for*_*rir 5

你的代码说:unsigned int k.所以k不是-68,它是unsigned.这使得ka非常大,基于4字节int,它将是4294967210.这显然远远超过0,所以它会花费你的for循环一段时间来获得那么高,尽管它最终会终止.

你认为它是-86的原因是,当你用类似函数打印它时NSLog,它没有直接了解传入的参数,它决定了如何处理参数,基于格式字符串,作为第一个提供论点.

你在打电话:这个:

NSLog(@"%d",k); 
Run Code Online (Sandbox Code Playgroud)

这告诉NSLog我们将参数视为一个signed int (%d).你应该这样做:

NSLog(@"%u",k); 
Run Code Online (Sandbox Code Playgroud)

因此,NSLog将参数视为它的类型:unsigned (%u). 请参阅NSLog文档.

就目前而言,我希望你的缓冲区溢出,在循环运行时丢失内存,你的应用程序崩溃.

反思之后,我相信@FreeAsInBeer是正确的,你不想在这种情况下迭代for循环,你可以通过使用signed int来解决这个问题.然而,在我看来,你会更好,检查len > sizeof(MSG_INFO),如果不是这样处理不同的情况.我能想到的大多数情况,如果我没有为消息读取足够的信息,我不想在for循环后执行任何处理...