You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何GCC静态分析器误报嵌套分配内存的指针存在泄漏?如何修复?

GCC静态分析器误报三重指针内存泄漏的修复方案

问题代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ***new = malloc(sizeof(int **));
    *new = malloc(sizeof(int *));
    **new = malloc(sizeof(int));

    ***new = 2137;
    printf("%i\n", ***new);

    free(**new);
    free(*new);
    free(new);

    return EXIT_FAILURE;
}

编译命令

gcc -Wall -Wextra -fanalyzer -g -O0 -fsanitize=address,undefined -o test2 test2.c

编译警告信息

test2.c: In function ‘main’:
test2.c:10:7: warning: leak of ‘malloc(4)’ [CWE-401] [-Wanalyzer-malloc-leak]
   10 |     ***new = 2137;
      |       ^~~~
  ‘main’: events 1-2
    |
    |    8 |     **new = malloc(sizeof(int));
    |      |             ^~~~~~~~~~~~~~~~~~~
    |      |             |
    |      |             (1) allocated here
    |    9 | 
    |   10 |     ***new = 2137;
    |      |       ~~~~   
    |      |       |
    |      |       (2) ‘malloc(4)’ leaks here; was allocated at (1)

问题描述

代码已按正确顺序释放所有分配的内存,但GCC静态分析器仍误报第8行的malloc存在内存泄漏,简化代码后问题依旧,该如何修复?


修复方案

这个误报源于GCC分析器对三重指针的内存操作追踪偏差:***new = 2137本质是修改指针指向的内存内容,但分析器错误将其识别为覆盖了**new指针本身的值,误以为指针丢失导致内存泄漏。

以下是两种可行的修复方式:

方式1:引入临时变量简化指针操作(推荐)

通过临时变量拆分多层指针解引用,让分析器清晰识别内存流向:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ***new = malloc(sizeof(int **));
    *new = malloc(sizeof(int *));
    **new = malloc(sizeof(int));

    // 用临时变量存储最内层指针,明确操作对象
    int *val_ptr = **new;
    *val_ptr = 2137;
    printf("%i\n", *val_ptr);

    free(**new);
    free(*new);
    free(new);

    return EXIT_FAILURE;
}

方式2:调整内存分配与赋值的顺序

先完成内存内容赋值,再将指针存入三重指针结构,避免分析器混淆:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ***new = malloc(sizeof(int **));
    *new = malloc(sizeof(int *));
    
    // 先给分配的内存赋值,再将指针绑定到三重指针
    int *temp = malloc(sizeof(int));
    *temp = 2137;
    **new = temp;
    
    printf("%i\n", ***new);

    free(**new);
    free(*new);
    free(new);

    return EXIT_FAILURE;
}

补充说明

  • 优先选择方式1,既解决误报,又提升代码可读性,避免多层指针嵌套的晦涩写法。
  • 若确认代码逻辑无问题,也可通过添加注释/* analyzer-disable-line malloc-leak */忽略该误报,但不建议滥用,优先优化代码结构。

内容的提问来源于stack exchange,提问作者Julian Zalewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:02:23