如何调整以下代码以防止缓冲区溢出?

时间:2016-12-08 03:53:25

标签: c buffer-overflow

void updateConfigParams( void ) {
    char buffer [512];
    int i = 0;

while (( c = readFromWireless ()) != NULL) 
{
    buffer [ i ] = c;
    i += 1; 
} 
writeConfigParams ( buffer );
}

我只是要处理缓冲区溢出问题所以请有人告诉我如何更改以下代码以防止缓冲区溢出,并解释新代码如何在缓冲区结束时停止写入。 / p>

5 个答案:

答案 0 :(得分:2)

您需要在while循环开始时添加缓冲区大小检查 if(i == sizeof(buffer))  打破;

如果writeConfigParams需要字符串

,则在缓冲区末尾添加\ 0

答案 1 :(得分:0)

您可以添加以下if语句来检查缓冲区溢出情况。在递增变量i之后

i+=1;
if(i > 512)
    break;

一旦i达到缓冲区限制,您将退出循环。

答案 2 :(得分:0)

Buffer overflow是指您尝试写入超出为缓冲区分配的内存地址。

在您的情况下,您已分配512个字节,因此您的代码应确保您永远不会在buffer + 511之外取消引用。换句话说

buffer [i] // i should never exceed 511

如果您的索引计数器达到等于缓冲区大小的检查,则检查将停止输入。

答案 3 :(得分:-1)

void updateConfigParams( void ) {
    char buffer [512];
    int i = 0;

    while (i < 512 && ( c = readFromWireless ()) != NULL) {
        buffer [ i++ ] = c;
    } 
    writeConfigParams ( buffer );
}

答案 4 :(得分:-1)

我会按照以下几点做点什么:

with open('filename.txt', 'w') as file:
    template = '{}^{}\n' * (len(a) // 2)
    formatted = template.format(*a)
    file.write(formatted)

根据您的计划状态,调用错误(3)可能更合适。重点是:

  • 写入数组时,请始终确保您处于界限内。
  • 将输入收集到数组中时,请始终为超出数组大小的输入做好准备。如何处理您无法接受的输入取决于应用程序。
  • 当程序员在编译时无法阻止内部存储时 - 例如无线设备发送&#34;太多&#34;数据 - 通知用户程序。上面,程序发出一条消息,该函数返回错误状态。
  • 部分输入通常是可疑的,不应被接受。

编辑:根据评论,我向bool updateConfigParams( void ) { char buffer[512] = {}; int i = 0; while( (c = readFromWireless()) != NULL ) { if( i == sizeof(buffer) - 1 ) { warn("readFromWireless exceeded %zu byte limit", sizeof(buffer)); return false; } buffer[i++] = c; } writeConfigParams( buffer ); return true; } 添加了初始化。由于buffer不接受长度参数,因此它可能接受以NUL结尾的字符串。