因爲濫用void *引起的bug

  我一貫認爲在寫代碼時,void *濫用是有問題的,在最近的一次代碼中, 有相似這樣一段代碼:spa

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 *默認兼容全部類型,若是把代碼改爲下面這樣:code

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.orm

  注:從語義上來講,send(void *buff, unsigned long size)會令人疑惑, 這個size是byte? word? dword?, 若是是unsigned char *,那size固然就是byte, 若是是unsigned short *, 那size固然就是word.(X86 platform)blog

相關文章
相關標籤/搜索