【发布时间】:2020-01-09 12:36:09
【问题描述】:
这段代码在 memset 上写了一个额外的字符,但是为什么?
int main(int argc, char ∗argv[]) {
char ∗a, ∗b;
a=(char ∗)malloc(12);
b=(char ∗)malloc(12);
if(!a || !b)
err(2, "malloc error.\\n");
bzero(a, 12); bzero(b, 12);
printf("%x %x (%i)\n", a, b, b−a); // b−a is d.
memset(a, (int)'a', 11);
memset(b, (int)'b', 11);
printf("a: %s\n", a);
printf("b: %s\n", b);
printf("−−−\n");
memset(a, (int)'a', b−a); // Heap−Overflow? Is this happening here ?
printf("a: %s\n", a);
free(a);
free(b);
return 0;
}
漏洞? 万一这将是一个密码,每次打印后都会有一个额外的字符?
【问题讨论】:
-
”和’不是"和'。你觉得b−a的结果是什么? -
不相关指针(如您的示例中的
a和b)之间的IIRC 算术是未定义的行为。 -
另请注意,要打印 (
void *) 指针,您应该使用%p格式说明符。指针减法的结果是(IIRC)一个size_t,应该用%zu打印。格式说明符和参数类型不匹配会导致未定义的行为。 -
您确实意识到
malloc(x)可以使用比x更多的字节 - 这些额外的字节用于管理。 -
@Someprogrammerdude,(定义明确的)指针减法的结果是
ptrdiff_t,它不一定与size_t类型相同。打印一个的最好方法可能是首先将其转换为您知道其格式说明符的整数类型。
标签: c