2014-01-23 76 views
0

我在我的不同文件中收到這些警告。我試圖解決它,但仍然有相同的警告(全部6場景)。警告639:在二進制操作中類型'uint64'的強類型不匹配

#define CMD_READ_ARRAY_FAST 0x0bU 
uint64 page_size; 
uint32 offset; 
uint64 page_addr; 
uint64 sector_size; 
uint8_t cmd[5]; 
size_t len; 
size_t actual; 

1) page_addr = (uint64) (offset/page_size); 

2) cmd[0] = CMD_READ_ARRAY_FAST; 
    cmd[1] = (uint8_t) (page_addr >> 8U); 
    cmd[2] = (uint8_t) page_addr; 
    cmd[3] = (uint8_t) (offset % page_size); 
    cmd[4] = 0x00U; 

3)page_addr = (uint64) (offset/page_size); 
4)byte_addr = (uint64) (offset % page_size); 
5)if ((offset % sector_size) || (len % sector_size)) 
6)cmd[1] = (uint8_t) ((offset/sector_size) + actual); 

請問您能告訴我爲什麼?

+0

更多MISRA問題..? – Sean

+0

嗨,肖恩,我試圖從我的模塊中刪除這些警告,但超過6位相同的警告是讓我頭痛,以完成這些事情..... – Ashwin

回答

0

我做這個方式解決上述問題:

#define CMD_READ_ARRAY_FAST 0x0bU 
uint64 page_size; 
uint32 offset; 
uint64 page_addr; 
uint64 sector_size; 
uint8_t cmd[5]; 
size_t len; 
size_t actual; 

1) page_addr = (uint64) (offset/page_size); 
Ans: (uint64) ((uint64)offset/page_size); 

2) cmd[0] = CMD_READ_ARRAY_FAST; 
    cmd[1] = (uint8_t) (page_addr >> 8U); 
    cmd[2] = (uint8_t) page_addr; 
    cmd[3] = (uint8_t) (offset % page_size); 
    cmd[4] = 0x00U; 

Ans:cmd[0] = CMD_READ_ARRAY_FAST; 
    cmd[1] = (uint8_t) (page_addr >> 8U); 
    cmd[2] = (uint8_t) page_addr; 
    cmd[3] = (uint8_t) ((uint8_t)offset % page_size); 
    cmd[4] = 0x00U; 


3)page_addr = (uint64) (offset/page_size); 
Ans: page_addr = (uint64) ((uint64)offset/page_size); 

4)byte_addr = (uint64) (offset % page_size); 
Ans: byte_addr = (uint64) ((uint64)offset % page_size); 

5)if ((offset % sector_size) || (len % sector_size)) 
Ans: if (((uint64)offset % sector_size) || ((uint64)len % sector_size)) { 

6)cmd[1] = (uint8_t) ((offset/sector_size) + actual); 
Ans: cmd[1] = (uint8_t) (((uint8_t)offset/(uint8_t)sector_size) + (uint8_t)actual); 
0

你的警告來自同一表達混合不同的整數類型,然後依靠隱式轉換起源。隱式轉換總是很糟糕,MISRA或不。

以下修復希望能借此掃清所有的警告:

1)

page_addr = (uint64_t)offset/page_size; 

2)一切看起來除了第3行確定。

cmd[3] = (uint8_t) ((uint64_t)offset % page_size); 

3)在操作之前再次將uint32_t轉換爲uint64_t。

4)在操作之前再次將uint32_t轉換爲uint64_t。

5)這裏有幾個MISRA違規。最好用幾行來重寫它,而不是一個很長的,不可讀的。例如:

bool cond1 = ((uint64_t)offset % sector_size) != 0; 
bool cond2 = ((uint64_t)len % sector_size) != 0; 

if (cond1 || cond2) 

6)這其中可能也必須幾行保持可讀:

uint64_t tmp = (uint64_t)offset/sector_size; 
cmd[1] = (uint8_t) (tmp + (uint64_t)actual); 
+0

謝謝Lundin ..我會相應地修改代碼將檢查結果和帖子... – Ashwin

相關問題