意外と陥るかも?ポインタの誤用

通過するTCP/UDPのポート番号を覗く様なプログラムを書いていたメンバーから、

実際に送信しているポート番号とプログラムが認識するポート番号が違っていると相談をうけました。




   u_int8_t *packet;
   struct ip *ip = packet + sizeof(struct ether_header);
   struct udphdr *udp = ip + sizeof(struct ip);
具体的には上記の様なコードで、udp のポート番号を見ると期待する番号とは違うというもの。



私もぱっと見たときは気がつかなかったのですが、

ip + sizeof(struct ip) が間違い箇所です。

変数 ip は struct ip 型のポインタなので、+1 するだけで sizeof(struct ip) 分アドレスが進みます。

意外とポインタは全て u_int8_t * の動きをすると勘違いしがちだという話しでした。