看板 C_and_CPP 關於我們 聯絡資訊
請問一下 我在跑一項語法檢查程式, 但是跳出底下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: 手冊說明如下,https://ibb.co/QmtRKvk 11/03 10:49
liptonbin: https://ibb.co/x2c5LWn 11/03 10:50
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