SET UP:如果我strncat到没有空终止符的字符串会发生什么?
鉴于这种代码:
char myString[4];
printf("%s\n", myString);
strncpy(myString, "hi", 2);
printf("%s\n", myString);
strncat(myString, "h123", 2);
printf("%s\n", myString);
这将打印:
KU�
hiU�
hiU�h1
我的预期:
在我的脑海里,MyString的是内存中分配点的指针,如下所示:
MEMORY: [random][random][random][\0][random][random][random]....
PRINTED: [random][random][random][\0]
它增加了一个空指针到所述存储器中的第四位串
函数strncpy后开始后:
MEMORY: [h][i][random][\0][random][random][random]...
PRINTED: [h][i][random][\0]
它改变了前两个字符是喜和不不添加\ 0
strncat函数后:
MEMORY: [h][i][random][h][1][2][3][\0]...
PRINTED: [h][i][random][h][1][2][3][\0]
它在字符串开始之后查找\ 0,然后删除\ 0并在末尾添加自己的字符串以及\ 0。
我的预期没有发生。
问题:
- 正在打印什么呢?
- 如果我所期望的是哪一部分是不正确的理解?
注:
现在,我明白,这不确定的行为,它应该是可以避免的,但我问从试图理解,可以在给定的使用所有可能的攻击的角度来看这个问题,码。
我不是在寻找适当的编码习惯。我正在寻找理解到底发生了什么问题。
编辑1
我也明白,文档说,它的不确定的行为,并从开发人员的角度必须恰好可以避免的可能性鼻恶魔。
但是从开发者的角度来看,这里正在发生一些事情,这可能不仅仅是一个错误,而是它可能是一个安全缺陷,可以更深入地理解,从而形成一致的漏洞利用。我希望更深层次的理解。的
这是未定义的行为。任何事情都可能发生。 –
myString的初始值是所有“随机”字节(或者垃圾发生在内存中),所以你的初始假设是错误的。 –
你在'myString'上试过'memset'为0吗? – Gaurav