如何重写以下函数,使其不再容易受到堆栈缓冲区溢出的影响?

时间:2010-12-17 14:18:46

标签: c stack-overflow

我需要重写函数,以便它不再容易受到堆栈缓冲区溢出的影响。

void hello (char *tag)
{
   char inp [16];

   printf("enter value for %s:", tag);
   gets(inp);
   printf("hello your %s is %s\n", tag, inp);
}

另外, 如何重写以下其他代码以避免缓冲区溢出:

int main (int argc, char *argv[ ]) {
    int valid=FALSE;
    char str1[8];
    char str2[8];

    next_tag(str1);
    gets(str2);
    if (strncmp(str1,str2,8)==0)
        valid=TRUE;
    printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid);
}

5 个答案:

答案 0 :(得分:1)

只需使用fgets()代替gets()即可。它允许您限制缓冲区中存储的字符数。

答案 1 :(得分:0)

使用fgets代替获取。将大小保持在缓冲区的长度,你不会溢出它。

答案 2 :(得分:0)

void hello (char *tag)
{
   char inp [16];

   printf("enter value for %s:", tag);
   fgets(inp, 16, stdin);
   printf("hello your %s is %s\n", tag, inp);
}

与另一个相似。

答案 3 :(得分:0)

我不会发布代码,因为这看起来像是家庭作业。

当您尝试访问超出其大小的缓冲区位置时,会发生缓冲区溢出。

例如,在hello(...)函数中,这将尝试访问大于15的数组inp的元素。

您要求用户为数组提供索引,然后返回该数组位置的值。

为了防止溢出,您总是需要确保指定的索引用户的范围低于该数组的大小。

我无法对第二个代码片段发表评论,因为它不完整。

答案 4 :(得分:0)

您可以在收到字符串后创建测试用例以检查其长度。 如果您接受输入,则继续以其他方式终止或恐慌!    
在此之前进行测试:

if (strncmp(str1,str2,8)==0)
    valid=TRUE;