主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

缓冲区大小被硬编码

内存缓冲区的大小是一个数值,而不是符号常量。

描述

当您在声明数组等内存缓冲区时,使用数字值代替符号常量时,会发生此缺陷。

风险

硬编码的缓冲区大小会导致以下问题:

  • 硬编码的缓冲区大小会增加出错的可能性,从而导致维护成本上升。如果政策变更要求开发人员修改缓冲区大小,他们必须在代码中修改所有缓冲区大小的实例。

  • 硬编码常量在代码被泄露时可能面临安全风险。

修复

使用符号名称代替硬编码常量来指定缓冲区大小。符号名称包括以 const 开头的变量、以 enum 开头的常量或宏。

建议使用 enum 常量。

  • 宏在预处理后被其常量值替换。因此,它们可以暴露循环边界。

  • enum 常量在编译时已知。因此,编译器可以更高效地优化循环。

    const-合格变量通常在运行时已知。

示例

全部展开

int table[100];

void read(int);

void func(void) {
    for (int i=0; i<100; i++)
        read(table[i]);
}

在此示例中,数组 table 的大小是硬编码的。

更正 - 使用符号名称

一种可能的更正方法是将硬编码的大小替换为符号名称。

const int MAX_1 = 100;        
#define MAX_2 100
enum { MAX_3 = 100 };

int table_1[MAX_1];
int table_2[MAX_2];
int table_3[MAX_3];

void read(int);

void func(void) {
    for (int i=0; i < MAX_1; i++)
        read(table_1[i]);
    for (int i=0; i < MAX_2; i++)
        read(table_2[i]);
    for (int i=0; i < MAX_3; i++)
        read(table_3[i]);
}

结果信息

组:良好做法
语言:C | C++
默认值:关闭
命令行语法:HARD_CODED_BUFFER_SIZE
影响

版本历史记录

在 R2015b 中推出