gpt4 book ai didi

c - 添加未使用变量的随机行为

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:33 25 4
gpt4 key购买 nike

我真的不知道如何给这个问题命名,问题是我在下面的代码中看到了一些非常神奇的事情。

我在这里放置了所有相关的代码片段及其输出。

void persist_receipt(Receipt * receipt, char * path)
{
int i, fd;
unsigned char block_fname[64];

fd = open( ".receipt", O_RDWR | O_CREAT, 0777);
printf("1.fd=%i\n", fd);
// Write receipt header
write(fd, receipt->hash, 32);
write(fd, receipt->name, 256);
write(fd, &receipt->size, sizeof(int));

printf("2.fd=%i\n", fd);

for(i=0; i<receipt->size; i++)
{
printf("3.fd=%i\n", fd);
sha2hexf(block_fname, receipt->blocks[i].hash);
printf("4.fd=%i\n", fd);
write(fd, block_fname, 64);
}

close(fd);
}

现在让我向您展示这段代码的输出:

1.fd=4
2.fd=4
3.fd=4
4.fd=0
85a2c67fe7f3dc586a0f231d0cc845e7094408769c8391da18d1ed35c7b1cb3c3.fd=0
4.fd=0
cbc6286fedb70a703f403e507e4daca7bb4a493cdd4d0f0c1787e56256afe5fd3.fd=0
4.fd=0
c364417c27bd887142e6c2de1f7a5b777d604c9df8bcd40bb1a20623b38de82b3.fd=0

这个随机文件描述符失去它的值(value)是怎么回事?由于他随机将他的值更改为 0,它会向控制台输出哈希值,但这不应该发生!

有趣的部分来了!如果我只是声明一个新变量。假设我像这样声明一个新整数:

void persist_receipt(Receipt * receipt, char * path)
{
int i, fd, p;
unsigned char block_fname[64];

fd = open( ".receipt", O_RDWR | O_CREAT, 0777);
printf("1.fd=%i\n", fd);
// Write receipt header
write(fd, receipt->hash, 32);
write(fd, receipt->name, 256);
write(fd, &receipt->size, sizeof(int));

printf("2.fd=%i\n", fd);

for(i=0; i<receipt->size; i++)
{
printf("3.fd=%i\n", fd);
sha2hexf(block_fname, receipt->blocks[i].hash);
printf("4.fd=%i\n", fd);
write(fd, block_fname, 64);
}

close(fd);
}

如你所见,现在我声明了一个 'p' 变量,让我们再次编译并运行它,天哪。

1.fd=4
2.fd=4
3.fd=4
4.fd=4
3.fd=4
4.fd=4
3.fd=4
4.fd=4
3.fd=4
4.fd=4
...

我希望有人甚至可以解释幕后发生的事情。因为这对我来说似乎是一些非常黑暗的魔法,就在那里。我怀疑有一些可疑的 'sha2hexf' 函数,所以我在这里也放了代码,特别可疑的部分是里面的 sprintf 调用。

void sha2hexf(unsigned char *outbuf, unsigned char *hash) {
int i;
for (i = 0; i < 32; i++) {
sprintf((char*)outbuf, "%.2x", hash[i]);
outbuf += 2;
}
}

有没有真正的解释?

最佳答案

您的函数 sha2hexf 非常明显地超出了您传入的缓冲区。它以 null 结尾的 64 字节字符串(因此缓冲区中至少需要 65 个字节)。

编译器通常会反向布置堆栈,因此您会得到:

block_fname (64 bytes) | fd (4 bytes) | i (4 bytes)

^ Overflow hits the first byte of 'fd', which zeros it
a little-endian architecture (if fd less than 256).

关于c - 添加未使用变量的随机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com