传递大小时,“调用'malloc'的分配大小为0字节”错误?

时间:2014-07-15 17:24:47

标签: ios c

我已经看到有关于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 

1 个答案:

答案 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来解决它。