Cec*_*lia 5 c realloc cppcheck
我使用realloc来调整分配的内存:
char **get_channel_name(void)
{
char **result;
int n;
result = (char **) 0;
for (elem = snd_mixer_first_elem(handle), n = 0; elem; elem = snd_mixer_elem_next(elem)) {
if (!snd_mixer_selem_is_active(elem))
continue;
if (snd_mixer_selem_has_playback_volume(elem) &&
snd_mixer_selem_has_playback_switch(elem) &&
snd_mixer_selem_has_capture_switch(elem)) {
if (result == (char **) 0)
result = (char **) malloc(sizeof(char *));
else
result = (char **) realloc(result, sizeof(char *) * (n + 1)); /* nulled but not freed upon failure */
result[n++] = strdup(snd_mixer_selem_get_name(elem));
}
}
if (result == (char **) 0)
return NULL;
result = (char **) realloc(result, sizeof(char *) * (n + 1)); /* nulled but not freed upon failure */
result[n] = NULL;
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我用cppcheck工具检查代码静态C/C++代码分析时,打印出以下警告:
Common realloc mistake: 'result' nulled but not freed upon failure
Run Code Online (Sandbox Code Playgroud)
如何修复这两个可能的内存泄漏?
如果realloc()失败则返回NULL.
所以,如果你这样做(假设realloc()会失败)
result = realloc(result, ...);
Run Code Online (Sandbox Code Playgroud)
result将被分配NULL,它指向的内容未被free()编辑,并且要free()编辑的地址将丢失.
要解决这个问题:
void * tmp = realloc(result, ...);
if (NULL == tmp)
{
/* Handle error case, propably freeing what result is pointing to. */
}
else
{
result = tmp;
}
Run Code Online (Sandbox Code Playgroud)