我的代码:
void temp(char *source)
{
char dest[41];
for(int i = 0; i < 20; i++)
{
sprintf(&dest[i*2], "%02x", (unsigned int)source[i]);
}
}
当我运行静态代码分析工具时,我会得到以下警告:
在循环的第19次迭代中,
:这段代码可以写过由&desti * 2指向的缓冲区的末尾。&desti *2的计算结果为dest + 38。sprintf()写入最多9个字节,从&desti * 2所指向的缓冲区的开头开始,从偏移量38开始,其容量为41 bytes.The,写入的字节数可能超过超出该偏移量的分配字节数。溢出发生在堆栈内存中。
我的问题是:由于在每个循环迭代中,我们只复制2个字节(考虑到机器上无符号int的大小为2个字节)从源复制到目标,那么在最后一个迭代中复制9个字节的可能性在哪里?
发布于 2019-12-18 06:16:16
可以对char
进行签名,在x86编译器中也是如此。在我的电脑上
#include <stdio.h>
int main(void) {
printf("%02x\n", (unsigned int)(char)128);
}
打印ffffff80
。
您要做的是使用格式"%02hhx"
和参数(unsigned char)c
。
https://stackoverflow.com/questions/59393480
复制相似问题