0

我的一段代码:

void temp(char *source)
{
    char dest[41];

    for(int i = 0; i < 20; i++)
    {
        sprintf(&dest[i*2], "%02x", (unsigned int)source[i]);
    }
}

当我运行静态代码分析工具时,我收到以下警告:

在循环的第 19 次迭代中:此代码可以写入 &dest[i * 2] 指向的缓冲区末尾。&dest[i * 2] 计算结果为 [dest + 38]。sprintf() 从 &dest[i * 2] 指向的缓冲区开头的偏移量 38 处开始最多写入 9 个字节,其容量为 41 个字节。写入的字节数可能超过超出该偏移量的分配字节数。溢出发生在堆栈内存中。

我的问题是:由于在每次循环迭代中,我们只从源到目标复制 2 个字节(考虑到机器上 unsigned int 的大小为 2 个字节),那么在最后一次迭代中复制 9 个字节的可能性在哪里?

4

1 回答 1

1

char可以签名,并且在 x86 编译器中默认是签名的。在我的电脑上

#include <stdio.h>

int main(void) {
    printf("%02x\n", (unsigned int)(char)128);
}

打印ffffff80

要做的是使用 format"%02hhx"和 argument (unsigned char)c

于 2019-12-18T14:16:16.237 回答