作者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://www.ptt.cc/bbs/C_and_CPP/M.1635743417.A.395.html
→ petercoin: 第二個參數要再乘上個數吧 11/01 14:48
→ petercoin: 沒事 我看錯行了Orz 11/01 14:49
推 gusion: 第一個是不是檢查程式認為應該要用table而不是&table[0]? 11/01 15:18
→ SuperJGL: 因為跑到memcpy的時候 沒有保證kcalloc成功 11/01 15:18
→ SuperJGL: 以第一個為例 data=NULL一樣會跑到memcpy 11/01 15:19
推 LPH66: 你的檢查是哪支程式檢查的? 11/01 16:03
→ lengcycat: LDRA軟體測試檢查的 11/01 16:47
推 LPH66: 看起來是套裝軟體, 去查他們的手冊裡這些錯誤訊息的意思 11/01 17:29
→ LPH66: 如果是公司軟體就去找相關部門要說明書 11/01 17:30
→ F04E: &table[0]的大小確實只有1byte 11/02 07:41
→ F04E: 為什麼memset時用table, 而memcpy用&table[0]?? 11/02 07:42
→ F04E: 改成 memcpy(table, data, 2048); 呢? 11/02 07:43
推 TWkobe: 同樓上 可能語法程式會用sizeof檢查你的引數 11/02 15:58
推 LPH66: 這就是為什麼我要原 PO 去找軟體手冊 11/02 16:16
→ LPH66: 我們在這裡只能猜軟體 (的設計者) 大概是怎麼想的 11/02 16:16
→ LPH66: 而實際上是不是這樣去找手冊裡一定會寫 11/02 16:16
→ LPH66: 尤其如果是套裝軟體這類的東西那不可能沒有這種手冊 11/02 16:17
→ liptonbin: 改成 memcpy(table, data, 2048);錯誤訊息仍是insuffic 11/03 10:53
→ liptonbin: ient space for operation: required=2048,avaiable=1 11/03 10:53
推 LPH66: 看起來手冊上面只有針對陣列進行舉例, 那你可以去找找 11/03 11:42
→ LPH66: 手冊其他地方有沒有對於動態記憶體配置相關的說明 11/03 11:42
→ LPH66: 你的程式碼看起來都跟動態配置有關 11/03 11:43
推 closer76: 可不可以試試看 1. 把 table 的 size 縮小 或 2. 把 tab 11/03 11:44
→ closer76: le 放到 global space? 11/03 11:44
→ LPH66: 不過我其實有一個更簡單的猜測是: 軟體看不懂 kcalloc 11/03 11:44
→ closer76: 老實說,看到你在 stack (local variable) 挖 2KB 的空 11/03 11:45
→ closer76: 間,覺得有些毛毛的…… 11/03 11:45
→ closer76: @LPH66: 也有道理!說不定工具是覺得讀取到不該讀的區域 11/03 11:47
→ closer76: ,而不是寫入! 11/03 11:47
→ LPH66: 理論上這種工具得要看得懂動態配置函數才能正確判斷 11/03 11:58
→ LPH66: 但既然是「要看得懂」那就是設計者要加入規則表示說 11/03 11:59
→ LPH66: 看到這些函數就當做這指標有指到這麼大的空間 11/03 11:59
→ LPH66: 那 kcalloc 這種只在 kernel 裡用的函數就可能不一定有考慮 11/03 12:00