我已经看到有关于malloc(0)
的问题会产生关于分配大小的警报。我的问题是,我正在使用大小来获取此警告。
在我的代码中:
midiFileEventCount的类型为uint32_t
BASS_MIDI_EVENT为struct
我在下面的行中收到警报。在该行之前,我检查midiFileEventCount
是否为非零。我的应用似乎运行正常。我在这里做错了吗?
这是在iOS 7.1上
midiFileEvents=(BASS_MIDI_EVENT*)malloc(midiFileEventCount*sizeof(BASS_MIDI_EVENT));
日志声明:
printf("midiFileEventCount %u \n", midiFileEventCount);
printf("BASS_MIDI_EVENT size: %lu \n", sizeof(BASS_MIDI_EVENT));
printf("midiFileEvents size: %lu \n", midiFileEventCount*sizeof(BASS_MIDI_EVENT));
输出:
midiFileEventCount 1684
BASS_MIDI_EVENT size: 20
midiFileEvents size: 33680
答案 0 :(得分:2)
因此,这可能是您代码中的潜在错误。分析器告诉您函数中存在可能的代码路径,其中大小为零。请考虑以下方法:
- (void *)foo:(int)size {
return malloc(size);
}
- (void *)bar:(int)size {
if (size == 0) {
NSLog(@"got zero size!");
}
return malloc(size);
}
第一种方法不会产生分析仪结果。第二个将产生您正在看到的相同诊断。 clang伙计的理由如下:通常,对malloc的调用可能没有传递零大小,因此foo
不太可能成为问题。但是,bar
显式检查大小为零,然后继续使用malloc。因此,由于您(代码编写者)显然希望的大小可能为零,因此它会警告您,在这种情况下,您需要对零字节进行malloc。 (如果扩展诊断,它将向您显示它正在做出的导致零大小分配的假设。)
当然,您可能永远不会实际调用该方法使其生成零大小的malloc,但分析器只能查看较小的代码区域并注意到#34;可疑"图案。
在上面bar
的情况下,你可以通过在传递零的情况下断言或返回NULL来解决它。