如何调整以下代码以防止缓冲区溢出?
How could the following code be adjusted to prevent a buffer overflow?
void updateConfigParams( void ) {
char buffer [512];
int i = 0;
while (( c = readFromWireless ()) != NULL)
{
buffer [ i ] = c;
i += 1;
}
writeConfigParams ( buffer );
}
我刚开始处理缓冲区溢出,所以请有人告诉我如何更改以下代码以防止缓冲区溢出,并解释新代码如何停止写入超过缓冲区的末尾.
您可以添加以下 if 语句来检查缓冲区溢出情况。在递增变量 i
之后
i+=1;
if(i > 512)
break;
一旦 i 达到缓冲区限制,您将退出循环。
您需要在 while 循环开始时添加缓冲区大小检查
如果(我== sizeof(缓冲区))
打破;
如果 writeConfigParams 需要字符串,则在缓冲区末尾添加 \0
Buffer overflow 是当您尝试写入超出为缓冲区分配的内存地址时。
在您的情况下,您已经分配了 512
个字节,因此您的代码应确保您永远不会取消引用超出 buffer + 511
个字节。也就是说
buffer [i] // i should never exceed 511
你的代码应该有 if 检查,一旦你的索引计数器达到等于缓冲区的大小就停止接受输入。
void updateConfigParams( void ) {
char buffer [512];
int i = 0;
while (i < 512 && ( c = readFromWireless ()) != NULL) {
buffer [ i++ ] = c;
}
writeConfigParams ( buffer );
}
我会按照以下思路做一些事情:
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;
}
根据程序的状态,简单地调用 err(3) 可能更合适。要点是:
- 写入数组时,请始终确保您在边界内。
- 将输入收集到数组中时,请始终为超出数组大小的输入做好准备。如何处理您无法接受的输入取决于应用程序。
- 当程序员无法在编译时阻止的操作超出内部存储时 -- 例如无线设备发送 "too much" 数据 -- 通知用户 和 程序。上面,程序发出一条消息,函数 returns 一个错误状态。
- 部分输入通常是可疑的,不应被接受。
编辑:根据评论,我将初始化添加到 buffer
。由于 writeConfigParams
没有长度参数,它可能接受以 NUL 结尾的字符串。
void updateConfigParams( void ) {
char buffer [512];
int i = 0;
while (( c = readFromWireless ()) != NULL)
{
buffer [ i ] = c;
i += 1;
}
writeConfigParams ( buffer );
}
我刚开始处理缓冲区溢出,所以请有人告诉我如何更改以下代码以防止缓冲区溢出,并解释新代码如何停止写入超过缓冲区的末尾.
您可以添加以下 if 语句来检查缓冲区溢出情况。在递增变量 i
之后i+=1;
if(i > 512)
break;
一旦 i 达到缓冲区限制,您将退出循环。
您需要在 while 循环开始时添加缓冲区大小检查 如果(我== sizeof(缓冲区)) 打破;
如果 writeConfigParams 需要字符串,则在缓冲区末尾添加 \0
Buffer overflow 是当您尝试写入超出为缓冲区分配的内存地址时。
在您的情况下,您已经分配了 512
个字节,因此您的代码应确保您永远不会取消引用超出 buffer + 511
个字节。也就是说
buffer [i] // i should never exceed 511
你的代码应该有 if 检查,一旦你的索引计数器达到等于缓冲区的大小就停止接受输入。
void updateConfigParams( void ) {
char buffer [512];
int i = 0;
while (i < 512 && ( c = readFromWireless ()) != NULL) {
buffer [ i++ ] = c;
}
writeConfigParams ( buffer );
}
我会按照以下思路做一些事情:
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;
}
根据程序的状态,简单地调用 err(3) 可能更合适。要点是:
- 写入数组时,请始终确保您在边界内。
- 将输入收集到数组中时,请始终为超出数组大小的输入做好准备。如何处理您无法接受的输入取决于应用程序。
- 当程序员无法在编译时阻止的操作超出内部存储时 -- 例如无线设备发送 "too much" 数据 -- 通知用户 和 程序。上面,程序发出一条消息,函数 returns 一个错误状态。
- 部分输入通常是可疑的,不应被接受。
编辑:根据评论,我将初始化添加到 buffer
。由于 writeConfigParams
没有长度参数,它可能接受以 NUL 结尾的字符串。