跳转至

Memory Leak

内存泄漏

描述

内存泄漏是一种意外的内存消耗形式,即应用程序在不再需要时未能释放已分配的内存块。此类问题的后果取决于应用程序本身。

请考虑以下三种常见情况:

  • 短暂的用户态 (User-land) 应用程序: 几乎没有明显影响。现代操作系统会在程序终止后回收丢失的内存。
  • 长期的用户态应用程序: 具有潜在危险。这些应用程序会随着时间的推移不断浪费内存,最终消耗所有的 RAM 资源。导致系统出现异常行为。
  • 内核态 (Kernel-land) 进程: 非常危险。内核级别的内存泄漏会导致严重的系统稳定性问题。与用户态内存相比,内核内存非常有限,应谨慎处理。

以下是 C 语言中基本的内存泄漏示例:

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

#define  LOOPS    10
#define  MAXSIZE  256

int main(int argc, char **argv)
{
     int count = 0;
     char *pointer = NULL;

     for(count=0; count<LOOPS; count++) {
          pointer = (char *)malloc(sizeof(char) * MAXSIZE);
     }

     free(pointer);

     return count;
}

在此示例中,我们进行了 10 次大小为 MAXSIZE 的分配。除了最后一次,所有的分配都丢失了。如果没有指针指向分配的块,在程序执行期间它是无法恢复的。解决此简单示例的一个简单方法是将 free() 调用放在 ‘for’ 循环内。

建议

在应用程序中避免内存泄漏很困难。您可以采取以下步骤来帮助检测和解决内存泄漏:

  • 使用性能分析工具 (Profiling Tools): 使用内存分析工具,如 Android Profiler(适用于 Android)或 Instruments(适用于 iOS),以识别内存泄漏和内存使用模式。
  • 使用泄漏检测库: 将泄漏检测库(如适用于 Android 的 LeakCanary 或适用于 iOS 的 Instruments)集成到您的开发过程中,以在开发和测试阶段自动检测并精确定位内存泄漏。
  • 使用 Sanitizers: 考虑使用诸如 HWAddressSanitizerGWP-ASanArm Memory Tagging Extension 等安全工具来构建您的应用程序。

链接

标准

  • OWASP_MASVS_L1:
    • MSTG_CODE_8
  • OWASP_MASVS_L2:
    • MSTG_CODE_8
  • CWE_TOP_25:
    • CWE_400
  • PCI_STANDARDS:
    • REQ_6_2
  • OWASP_MASVS_v2_1:
    • MASVS_RESILIENCE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255