Linux (x86、32 ビット) でプログラムを書きましたが、すべて正常に動作します。しかし、Solaris (SPARC、64 ビット) で同じソース コードをコンパイルして実行しようとすると、バス エラー (SIGBUS) が発生しました。 gdb からのメッセージは次のとおりです。
gdb) where
#0 0xff2aa57c in number () from /lib/libc.so.1
#1 0xff2a9a70 in __doscan_u () from /lib/libc.so.1
#2 0xff2b0014 in vsscanf () from /lib/libc.so.1
#3 0xff2aeb90 in fscanf () from /lib/libc.so.1
#4 0x00010940 in main (argc=4, argv=0xffbff48c) at wHeap.c:22
fscanf 関数が原因でバグが発生していることが判明し、対応するコード スニップは次のようになります。
while( fscanf(input,"%[^,],%hu,%u,%u,%[^\n]\n",record.name,&record.race,&record.class,&record.id,record.guild) != EOF){
......
}
基本的に、コンマ区切り値ファイルから情報を抽出し、それらを構造体(レコード)の配列に格納しようとします。たとえば、次のようになります。
Rod'rod,1,4,103026,Project Peace
Ceru,1,6,89351,World Keepers
Belget,2,9,246708,Radiant Heaters
レコード構造は次のとおりです。
#pragma pack(1)
typedef struct {
char name[MAXNAME];
unsigned short race;
unsigned int class;
unsigned int id;
char guild[MAXGUILD];
}record;
お気づきかもしれませんが、プラグマ パックを使用して、これら 2 つのマシンのアライメントの違いを回避しようとしました。