2016-12-08 61 views
-2
void updateConfigParams(void) { 
    char buffer [512]; 
    int i = 0; 

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

我只是在处理缓冲区溢出问题,所以请有人告诉我如何更改下面的代码以防止缓冲区溢出,并解释新代码如何停止写入缓冲区末尾。如何调整以下代码以防止缓冲区溢出?

+2

你了解缓冲区溢出吗?如果是的话,那么它相当微不足道。 – bashrc

+0

@bashrc这就是我努力去理解它的问题。 – HHEX

+1

难道你只是确保它不会超过你的512尺寸? –

回答

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

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

'writeConfigParams()'如何知道要写多少缓冲区? – chux

0

您可以添加以下if语句来检查缓冲区溢出条件。增加变量后我

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

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

2

如果(i == sizeof(buffer)) break,则需要在while循环的开始处添加缓冲区大小检查 ;

,并在缓冲区的末尾添加\ 0,如果writeConfigParams需要一个字符串

0

Buffer overflow是当你尝试写超出分配给缓冲区的内存地址。

在你的情况下,你已经分配了512字节,所以你的代码应该确保你永远不会脱离buffer + 511之外的参考。换句话说

buffer [i] // i should never exceed 511

你的代码应该检查是否停止服用一次输入你的索引计数器达到等于缓冲区的大小。

+0

OP的问题是如何做到这一点,所以你没有回答这个问题。 –

+0

@CareyGregory “如果您的索引计数器达到等于缓冲区大小时,您的代码应该有检查以停止输入。” 另请参阅OP对我评论的回复。 >>你了解缓冲区溢出吗? >> @ bashrc这就是我努力去理解它的问题。 – bashrc

-1

我会做一些大意如下:

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)。重要的一点是:

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

编辑:根据评论,我添加了初始化到buffer。由于writeConfigParams不接受长度参数,因此可能接受NUL终止的字符串。

+1

'writeConfigParams()'如何知道'buffer'要写多少? – chux

+0

什么是'c'?你只是依靠它违约'int'? –

+0

@CareyGregory,我不知道'c'是什么。它当然不会对任何事物“默认”。我没有'writeConfigParams'声明,依此类推。这是他的代码,它不能编译。他没有要求编译它;他问如何处理缓冲区溢出。这是我回答的问题。如果我的答案会被低估,我一定会想知道它是如何回答问题的。 –