天天看點

由于濫用void *引發的bug

  我一向認為在寫代碼時,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