我一向認為在寫代碼時,void *濫用是有問題的,在最近的一次代碼中, 有類似這樣一段代碼:
1 int send(void *buff, unsigned long size);
2
3 int xx_func(char *buff, unsigned long size)
4 {
5 unsigned send_size;
6 .........
7
8 send(&buff, send_size);
9 return 0;
10 }
暫且不論為什麼作者會錯寫成取位址,但其原意是想發送經過處理後的buff裡面的内容, 但是編譯器是不會報錯的,因為void *預設相容所有類型,如果把代碼改成下面這樣:
int send(unsigned char *buff, unsigned long size);
int xx_func(char *buff, unsigned long size)
{
unsigned long send_size;
.........
//send(&buff, send_size);
//send(buff, send_size);
send((unsigned char *)buff, send_size);
}
其實前兩種編譯在進行參數檢查時,都會報警的,隻有寫成第三種形式,編譯器才會真正通過,如你寫成第三種形式時不會去看buff, 到底是什麼,那我也沒話說了。當然如果你忽略警告我也沒啥可說的了哈哈,我隻想說應該盡可能的去利用編譯器來發現潛在bug.
注:從語義上來說,send(void *buff, unsigned long size)會使人疑惑, 這個size是byte? word? dword?, 如果是unsigned char *,那size當然就是byte, 如果是unsigned short *, 那size當然就是word.(X86 platform)
轉載于:https://www.cnblogs.com/findstr/p/3550774.html