作者lengcycat (wind)
看板C_and_CPP
标题[问题] 请问 memcpy
时间Mon Nov 1 13:10:15 2021
请问一下
我在跑一项语法检查程式,
但是跳出底下memcpy使用错误,请问是真的有错吗,谢谢
(1)Error: memcpy insufficient space for operation: data: required=2048, available=1
Code:
unsigned char table[2048];
unsigned char *data;
data = kcalloc(2048, sizeof(unsigned char), GFP_KERNEL);
if (data== NULL) {
dev_err(&client->dev, "kcalloc data failed\n");
}
memset(table, 0, sizeof(table));
memcpy(&table[0], data, 2048);
kfree(data);
(2)请问跳出底下memcpy使用错误,请问我的code是真的有错吗,谢谢
Error: Size mismatch in memcpy: g_read_buf[], available:1 , required:4
Code:
unsigned char *g_read_buf,
main()
{
......
g_read_buf = kcalloc(MAX_REPORT_PACKET_SIZE, sizeof(char), GFP_KERNEL);
if (g_read_buf == NULL) {
pr_err("kcalloc g_read_buf failed\n");
}
……
}
int i2c_pda_read(struct i2c_client *client, unsigned int u32_addr, unsigned char *r_data, unsigned short length)
{
struct ts_data *ts = i2c_get_clientdata(client);
struct i2c_msg msg[] = {
{
.addr = I2C_NID,
.flags = I2C_WRITE,
.len = 1,
.buf = &u8_buf,
.scl_rate = 400 * 1000,
},
{
.addr = I2C_NID,
.flags = I2C_READ,
.len = u16_length,
.buf = g_read_buf,
.scl_rate = 400 * 1000,
},
};
u8_mode |= 0x03;
i2c_pda_set_address(ts, u32_addr, u8_mode)
if (i2c_transfer(ts->client->adapter, msg, 2) == 2)
{
memcpy(r_data, g_read_buf, length);
}
return 0;
}
-----
Sent from JPTT on my Asus ASUS_Z012DA.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.39.209 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1635743417.A.395.html
1F:→ petercoin: 第二个参数要再乘上个数吧 11/01 14:48
2F:→ petercoin: 没事 我看错行了Orz 11/01 14:49
3F:推 gusion: 第一个是不是检查程式认为应该要用table而不是&table[0]? 11/01 15:18
4F:→ SuperJGL: 因为跑到memcpy的时候 没有保证kcalloc成功 11/01 15:18
5F:→ SuperJGL: 以第一个为例 data=NULL一样会跑到memcpy 11/01 15:19
6F:推 LPH66: 你的检查是哪支程式检查的? 11/01 16:03
7F:→ lengcycat: LDRA软体测试检查的 11/01 16:47
8F:推 LPH66: 看起来是套装软体, 去查他们的手册里这些错误讯息的意思 11/01 17:29
9F:→ LPH66: 如果是公司软体就去找相关部门要说明书 11/01 17:30
10F:→ F04E: &table[0]的大小确实只有1byte 11/02 07:41
11F:→ F04E: 为什麽memset时用table, 而memcpy用&table[0]?? 11/02 07:42
12F:→ F04E: 改成 memcpy(table, data, 2048); 呢? 11/02 07:43
13F:推 TWkobe: 同楼上 可能语法程式会用sizeof检查你的引数 11/02 15:58
14F:推 LPH66: 这就是为什麽我要原 PO 去找软体手册 11/02 16:16
15F:→ LPH66: 我们在这里只能猜软体 (的设计者) 大概是怎麽想的 11/02 16:16
16F:→ LPH66: 而实际上是不是这样去找手册里一定会写 11/02 16:16
17F:→ LPH66: 尤其如果是套装软体这类的东西那不可能没有这种手册 11/02 16:17
20F:→ liptonbin: 改成 memcpy(table, data, 2048);错误讯息仍是insuffic 11/03 10:53
21F:→ liptonbin: ient space for operation: required=2048,avaiable=1 11/03 10:53
22F:推 LPH66: 看起来手册上面只有针对阵列进行举例, 那你可以去找找 11/03 11:42
23F:→ LPH66: 手册其他地方有没有对於动态记忆体配置相关的说明 11/03 11:42
24F:→ LPH66: 你的程式码看起来都跟动态配置有关 11/03 11:43
25F:推 closer76: 可不可以试试看 1. 把 table 的 size 缩小 或 2. 把 tab 11/03 11:44
26F:→ closer76: le 放到 global space? 11/03 11:44
27F:→ LPH66: 不过我其实有一个更简单的猜测是: 软体看不懂 kcalloc 11/03 11:44
28F:→ closer76: 老实说,看到你在 stack (local variable) 挖 2KB 的空 11/03 11:45
29F:→ closer76: 间,觉得有些毛毛的…… 11/03 11:45
30F:→ closer76: @LPH66: 也有道理!说不定工具是觉得读取到不该读的区域 11/03 11:47
31F:→ closer76: ,而不是写入! 11/03 11:47
32F:→ LPH66: 理论上这种工具得要看得懂动态配置函数才能正确判断 11/03 11:58
33F:→ LPH66: 但既然是「要看得懂」那就是设计者要加入规则表示说 11/03 11:59
34F:→ LPH66: 看到这些函数就当做这指标有指到这麽大的空间 11/03 11:59
35F:→ LPH66: 那 kcalloc 这种只在 kernel 里用的函数就可能不一定有考虑 11/03 12:00