[问题] 请问 memcpy

楼主: lengcycat (wind)   2021-11-01 13:10:15
请问一下
我在跑一项语法检查程式,
但是跳出底下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;
}
作者: petercoin (彼得币)   2021-11-01 14:48:00
第二个参数要再乘上个数吧没事 我看错行了Orz
作者: gusion   2021-11-01 15:18:00
第一个是不是检查程式认为应该要用table而不是&table[0]?
作者: SuperJGL ( )   2021-11-01 15:18:00
因为跑到memcpy的时候 没有保证kcalloc成功以第一个为例 data=NULL一样会跑到memcpy
作者: LPH66 (-6.2598534e+18f)   2021-11-01 16:03:00
你的检查是哪支程式检查的?
楼主: lengcycat (wind)   2021-11-01 16:47:00
LDRA软件测试检查的
作者: LPH66 (-6.2598534e+18f)   2021-11-01 17:29:00
看起来是套装软件, 去查他们的手册里这些错误讯息的意思如果是公司软件就去找相关部门要说明书
作者: F04E (Fujitsu)   2021-11-02 07:41:00
&table[0]的大小确实只有1byte为什么memset时用table, 而memcpy用&table[0]??改成 memcpy(table, data, 2048); 呢?
作者: TWkobe (中华柯比)   2021-11-02 15:58:00
同楼上 可能语法程式会用sizeof检查你的引数
作者: LPH66 (-6.2598534e+18f)   2021-11-02 16:16:00
这就是为什么我要原 PO 去找软件手册我们在这里只能猜软件 (的设计者) 大概是怎么想的而实际上是不是这样去找手册里一定会写尤其如果是套装软件这类的东西那不可能没有这种手册
作者: liptonbin (我还存在耶)   2021-11-03 10:49:00
手册说明如下,https://ibb.co/QmtRKvkhttps://ibb.co/x2c5LWn改成 memcpy(table, data, 2048);错误讯息仍是insufficient space for operation: required=2048,avaiable=1
作者: LPH66 (-6.2598534e+18f)   2021-11-03 11:42:00
看起来手册上面只有针对阵列进行举例, 那你可以去找找手册其他地方有没有对于动态内存配置相关的说明你的程式码看起来都跟动态配置有关
作者: closer76 (克楼瑟)   2021-11-03 11:44:00
可不可以试试看 1. 把 table 的 size 缩小 或 2. 把 table 放到 global space?
作者: LPH66 (-6.2598534e+18f)   2021-11-03 11:44:00
不过我其实有一个更简单的猜测是: 软件看不懂 kcalloc
作者: closer76 (克楼瑟)   2021-11-03 11:45:00
老实说,看到你在 stack (local variable) 挖 2KB 的空间,觉得有些毛毛的……@LPH66: 也有道理!说不定工具是觉得读取到不该读的区域,而不是写入!
作者: LPH66 (-6.2598534e+18f)   2021-11-03 11:58:00
理论上这种工具得要看得懂动态配置函数才能正确判断但既然是“要看得懂”那就是设计者要加入规则表示说看到这些函数就当做这指标有指到这么大的空间那 kcalloc 这种只在 kernel 里用的函数就可能不一定有考虑

Links booklink

Contact Us: admin [ a t ] ucptt.com