[問題] 請問 memcpy

看板C_and_CPP (C/C++)作者 (wind)時間2年前 (2021/11/01 13:10), 編輯推噓8(8027)
留言35則, 9人參與, 2年前最新討論串1/1
請問一下 我在跑一項語法檢查程式, 但是跳出底下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

11/01 14:48, 2年前 , 1F
第二個參數要再乘上個數吧
11/01 14:48, 1F

11/01 14:49, 2年前 , 2F
沒事 我看錯行了Orz
11/01 14:49, 2F

11/01 15:18, 2年前 , 3F
第一個是不是檢查程式認為應該要用table而不是&table[0]?
11/01 15:18, 3F

11/01 15:18, 2年前 , 4F
因為跑到memcpy的時候 沒有保證kcalloc成功
11/01 15:18, 4F

11/01 15:19, 2年前 , 5F
以第一個為例 data=NULL一樣會跑到memcpy
11/01 15:19, 5F

11/01 16:03, 2年前 , 6F
你的檢查是哪支程式檢查的?
11/01 16:03, 6F

11/01 16:47, 2年前 , 7F
LDRA軟體測試檢查的
11/01 16:47, 7F

11/01 17:29, 2年前 , 8F
看起來是套裝軟體, 去查他們的手冊裡這些錯誤訊息的意思
11/01 17:29, 8F

11/01 17:30, 2年前 , 9F
如果是公司軟體就去找相關部門要說明書
11/01 17:30, 9F

11/02 07:41, 2年前 , 10F
&table[0]的大小確實只有1byte
11/02 07:41, 10F

11/02 07:42, 2年前 , 11F
為什麼memset時用table, 而memcpy用&table[0]??
11/02 07:42, 11F

11/02 07:43, 2年前 , 12F
改成 memcpy(table, data, 2048); 呢?
11/02 07:43, 12F

11/02 15:58, 2年前 , 13F
同樓上 可能語法程式會用sizeof檢查你的引數
11/02 15:58, 13F

11/02 16:16, 2年前 , 14F
這就是為什麼我要原 PO 去找軟體手冊
11/02 16:16, 14F

11/02 16:16, 2年前 , 15F
我們在這裡只能猜軟體 (的設計者) 大概是怎麼想的
11/02 16:16, 15F

11/02 16:16, 2年前 , 16F
而實際上是不是這樣去找手冊裡一定會寫
11/02 16:16, 16F

11/02 16:17, 2年前 , 17F
尤其如果是套裝軟體這類的東西那不可能沒有這種手冊
11/02 16:17, 17F

11/03 10:49, 2年前 , 18F
手冊說明如下,https://ibb.co/QmtRKvk
11/03 10:49, 18F

11/03 10:50, 2年前 , 19F
11/03 10:50, 19F

11/03 10:53, 2年前 , 20F
改成 memcpy(table, data, 2048);錯誤訊息仍是insuffic
11/03 10:53, 20F

11/03 10:53, 2年前 , 21F
ient space for operation: required=2048,avaiable=1
11/03 10:53, 21F

11/03 11:42, 2年前 , 22F
看起來手冊上面只有針對陣列進行舉例, 那你可以去找找
11/03 11:42, 22F

11/03 11:42, 2年前 , 23F
手冊其他地方有沒有對於動態記憶體配置相關的說明
11/03 11:42, 23F

11/03 11:43, 2年前 , 24F
你的程式碼看起來都跟動態配置有關
11/03 11:43, 24F

11/03 11:44, 2年前 , 25F
可不可以試試看 1. 把 table 的 size 縮小 或 2. 把 tab
11/03 11:44, 25F

11/03 11:44, 2年前 , 26F
le 放到 global space?
11/03 11:44, 26F

11/03 11:44, 2年前 , 27F
不過我其實有一個更簡單的猜測是: 軟體看不懂 kcalloc
11/03 11:44, 27F

11/03 11:45, 2年前 , 28F
老實說,看到你在 stack (local variable) 挖 2KB 的空
11/03 11:45, 28F

11/03 11:45, 2年前 , 29F
間,覺得有些毛毛的……
11/03 11:45, 29F

11/03 11:47, 2年前 , 30F
@LPH66: 也有道理!說不定工具是覺得讀取到不該讀的區域
11/03 11:47, 30F

11/03 11:47, 2年前 , 31F
,而不是寫入!
11/03 11:47, 31F

11/03 11:58, 2年前 , 32F
理論上這種工具得要看得懂動態配置函數才能正確判斷
11/03 11:58, 32F

11/03 11:59, 2年前 , 33F
但既然是「要看得懂」那就是設計者要加入規則表示說
11/03 11:59, 33F

11/03 11:59, 2年前 , 34F
看到這些函數就當做這指標有指到這麼大的空間
11/03 11:59, 34F

11/03 12:00, 2年前 , 35F
那 kcalloc 這種只在 kernel 裡用的函數就可能不一定有考慮
11/03 12:00, 35F
文章代碼(AID): #1XVtQvEL (C_and_CPP)
文章代碼(AID): #1XVtQvEL (C_and_CPP)