我需要重写函数,以便它不再容易受到堆栈缓冲区溢出的影响。
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);
}
答案 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;