[問題] 請問 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