プロが教える店舗&オフィスのセキュリティ対策術

linux32bitで動いているC言語のアプリを、linux64bitに移行する作業をしています。
1.long型とポインタ型のサイズが変更になったとのことなので
  size_t、time_tで検索して、返り値をintに入れるなどしてないことを確認まではしたのですが、
  long型、ポインタ型の量が多すぎて途方に暮れています
  やはり、コツコツ調べるしかないでしょうか?
2.バイトオーダーを行っています。htonlやntohlの64bit版はないのでしょうか?

どうぞよろしくお願いします

A 回答 (5件)

>バイトオーダーを行っています。

htonlやntohlの64bit版はないのでしょうか?
バイトオーダーを行っています。・・この意味が不明です。
バイトオーダーの変換を行っています。と理解します。
linux32bitで動いているC言語のアプリを、linux64bitに移行する場合、
無条件にバイトオーダーの変換を行うなら、htonlやntohlを使うべきではありません。
これは、実行時のマシンがsparc系(ビッグエンディアン)なら、一切データの変換は行われません。
実行時のマシンがINTEL系(リトルエンディアン)の場合に、エンディアン変換を行います。
そもそも、エンディアン変換を行うのは、ネットワーク通信でポート番号及びIPアドレスを変換する場合のみです。IPV6については、判りませんが、少なくともIPV4環境では、htnl,ntohlの64ビット版は必要ありません。(64ビットアプリでもhtnl,ntohlを使用すればIPアドレスの変換を正しく行えます)
無条件に64ビットデータ(8バイトデータ)のエンディアン変換をしたい為に、htnl,ntohlの64ビット版がほしいといわれているように見えますが、そうであれば、そもそも、32ビットアプリの時に
その機能を実装しているのではないでしょうか?
long型のデータを通信相手に送信する場合、32ビットアプリでは4バイトのデータを送りますが、
64ビットアプリでは8バイトのデータを送ることになりますが、これは、そもそもあってはならないことです。つまり、送信側の都合で(32ビットから64ビットアプリに変わったという理由で)、送るデータのサイズが変化してはいけない筈です。
つまり、32ビットアプリの時点で、4バイトのバイトオーダ変換をしている場合は、
64ビットでも4バイトのバイトオーダー変換をすべきです。
又、つまり、32ビットアプリの時点で、8バイトのバイトオーダ変換をしている場合は、
その時点で8バイトのバイトオーダー変換の機能を実装しているはずなので、新たにその機能を求める必要はないということです。

以上が、htnl,ntohlの64ビット版に対する回答ですが、無条件にバイトオーダーの変換を行う機能が
欲しいいうことであれば、linuxでは16ビット、32ビット、64ビットようにバイトオーダーのスワップマクロが提供されています。
bswap_16、bswap_32、bswap_64がありますのでそれが、使用可能です。
以下、使用サンプルです。
---------------------------------------
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <byteswap.h>
dump(char *name,int len,void *ptr)
{
int i;
unsigned char *p = (unsigned char*)ptr;
printf("%s=",name);
for(i=0;i < len; i++,p++){
printf("%02X",*p);
}
printf("\n");
}
int main(int argc , char *argv[])
{
//64ビット環境あることの確認
long long1;
short short1;
int int1;
long long int longlong1;
printf("sizeof long=%d\n",sizeof(long1));
printf("sizeof short=%d\n",sizeof(short1));
printf("sizeof int=%d\n",sizeof(int1));
printf("sizeof long long=%d\n",sizeof(longlong1));
long1 = 0x0123456789ABCDEFLL;
short1 = 0xABCD;
int1 = 0x1234ABCD;
longlong1 = 0x123456789ABCDEF0LL;
//スワップ前
dump("long1",8,&long1);
dump("short1",2,&short1);
dump("int1",4,&int1);
dump("longlong1",8,&longlong1);
long1 = bswap_64(long1);
short1 = bswap_16(short1);
int1 = bswap_32(int1);
longlong1 = bswap_64(longlong1);
//スワップ後
dump("long1",8,&long1);
dump("short1",2,&short1);
dump("int1",4,&int1);
dump("longlong1",8,&longlong1);
return 0;
}
------------------------------------------------
以下、実行結果です。
sizeof long=8
sizeof short=2
sizeof int=4
sizeof long long=8
long1=EFCDAB8967452301
short1=CDAB
int1=CDAB3412
longlong1=F0DEBC9A78563412
long1=0123456789ABCDEF
short1=ABCD
int1=1234ABCD
longlong1=123456789ABCDEF0
----------------------------------------------
CentOS release 6.3 (Final)
Kernel 2.6.32-279.el6.x86_64 on an x86_64
で実行しました。
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
で、-m64 オプションでコンパイル&リンクした結果です。
    • good
    • 2

No.2 です。


他の方が64bit版の存在を示された通りですので、2 の質問回答の「無い」と言う部分は撤回しておきます。
    • good
    • 1

2 について:


「バイトオーダーを行っています」は意味不明だがひょっとしたら
http://linuxjm.sourceforge.jp/html/LDP_man-pages …
でいける?
    • good
    • 0

2. ... 無いと思います。


ですが、bswap系関数のマクロだったりするので、必要なら模倣して64bitのマクロ書けば済むと思います。
    • good
    • 0
この回答へのお礼

やはり、自分で書くしかないですか。
関数マクロなんですね。クラスを追加しなくてはいけないかなと思ってました。
ありがとうございました

お礼日時:2015/03/22 14:03

量にもよりますが、gccに-Wallオプションをつけてコンパイルすれば、型が合わないところはレポートしてくれます。

一つずつ潰していけるぐらいの量であれば、コードを自分でレビューしながら潰すよりは正確だと思います。
    • good
    • 0
この回答へのお礼

そんなオプションがあるのですね。知りませんでした。
目でつぶしたところも含めて、確認したいと思います。
ありがとうございます!

お礼日時:2015/03/22 13:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています