[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00134] Re: patch-1.1.1-a008, patch-1.1.1-a009




古川竜雄です。

にしくさん> OpenBSD 2.5-Releaseでのコンパイル結果です。

レポートありがとうございます。実は 1.1.1-a010 のリリースで一旦コードフ
リーズして皆さんにテストをお願いしようと思っていたのですが、見事にこけ
てしまいました。とほほ…。


にしくさん> まだインストール&実行は行ってません。エラーでストップとい
にしくさん> うことはありませんでしたがwarningがいくつか出ています。

試しにインストールする時は

    $ ./configure --prefix=/tmp/fwtest

というような感じで configure するといいです。こうすると make install 
するときに /usr/local/… に入るはずのものがすべて /tmp/fwtest/… に入
るようになります。既存の FreeWnn(もしくは Wnn) を壊さずにテストできま
すよ。

んで、本題です。

本心では、これらは全部 Warning ですので、とりあえず動くはずで、それな
らリリースを優先させるというやりかたもあるのではと思うのですが、1点き
になるところがある(do_hindo_s.c の integer overflow)ので、やっぱり真面
目に見ることにします。

------------------------------------------------------------------------------

>> ../de.c:83: warning: `NOFILE' redefined
>> /usr/include/sys/param.h:75: warning: this is the location of the previous definition

これは 1.1.1-a011 で直しました。エラーメッセージが出ないことを確認していただ
けないでしょうか?

------------------------------------------------------------------------------

>> ../de.c: In function `demon_init':
>> ../de.c:487: warning: passing arg 1 of `time' from incompatible pointer type

これは

	srand((int)time((long *)0));

ですね。余計な cast をつけて怒られている例ですね。ここは NULL にしてし
まっていいはずなので

	srand((int)time(NULL));

としてみました。1.1.1-a011 では何も言われないはずです。テストお願いし
ます。

------------------------------------------------------------------------------

>> error.c: In function `my_error':
>> error.c:88: warning: passing arg 1 of `time' from incompatible pointer type

これも

    obakenoQ = time((long *)0);

なので上記の例にしたがって

    obakenoQ = time(NULL);

としてみました。

------------------------------------------------------------------------------

>> error.c:101: warning: passing arg 1 of `localtime' from incompatible pointer
>> type
>> error.c:113: warning: passing arg 1 of `localtime' from incompatible pointer
>> type

これは
	      asctime(localtime(&obakenoQ)),

の部分ですね。ちなみに obakenoQ (なんつー変数名だ) は

  long obakenoQ;

ですね。

localtime() の関数プロトタイプを見せてもらえませんか? 具体的には

    $ man localtime 

とした時の冒頭部分です。ちなみに私の環境 Linux/Slackware3.1 では


>> CTIME(3)            Linux Programmer's Manual            CTIME(3)
>> 
>> NAME
>>        asctime,  ctime,  gmtime,  localtime, mktime - transform binary date and time to
>>        ASCII
>> 
>> SYNOPSIS
>>        #include <time.h>
>> 
>>        char *asctime(const struct tm *timeptr);
>> 
>>        char *ctime(const time_t *timep);
>> 
>>        struct tm *gmtime(const time_t *timep);
>> 
>>        struct tm *localtime(const time_t *timep);
>> 
>>        time_t mktime(struct tm *timeptr);
>> 
>>        extern char *tzname[2];
>>        long int timezone;
>>        extern int daylight;

こんな感じになります。

ところで time_t があるかないかってのは autoconf の組み込みマクロにはあ
りませんよね? (チェックプログラムは自分で書くしかないのかな?)

------------------------------------------------------------------------------

>> ../de.c: In function `demon_fin':
>> ../de.c:529: warning: passing arg 2 of `accept' from incompatible pointer
>> type
>> ../de.c:550: warning: passing arg 2 of `accept' from incompatible pointer
>> type

これは
	    if (accept(sock_d_un, &addr_un, &addrlen) < 0) break;

ですね。んで、addr_un は以下のように定義されています。

#ifdef	AF_UNIX
static struct sockaddr_un saddr_un;	/**	ソケット	**/
#endif	/* AF_UNIX */

実は私の環境(Linux/Slackware3.1)では AF_UNIX が定義されていないのでこ
このテストができません。そこで、man accept の冒頭に

>> NAME
>>        accept - accept a connection on a socket
>> 
>> SYNOPSIS
>>        #include <sys/types.h>
>>        #include <sys/socket.h>
>>        int accept(int s, struct sockaddr *addr, int *addrlen);

こんな感じでプロトタイプ定義が書かれていると思うのですが、それを見せて
もらえませんか? 

# 私はネットワークプログラミング未経験なので詳しい方のアドバイスがい
# ただけると嬉しいです。

------------------------------------------------------------------------------

>> do_hindo_s.c: In function `hindo_set':
>> do_hindo_s.c:135: warning: integer overflow in expression
>> do_hindo_s.c:140: warning: integer overflow in expression

これは

	 ( RAND() < (double)1 / ((hindo >> 2) + 1)))

でエラーになってますね。んで、RAND() が以下のように定義されてますが、

#ifdef SRAND48
    double drand48();
#define RAND()  drand48()
#else
    double drand();
#define RAND()  ((double)rand() / (double)((1<<31) - 1))
#endif

もしかして、OpenBSD 2.5 って int が 16 ビットなのでしょうか? (まさかね
え…)

1. ちょっと以下のプログラムを動かして結果を教えてもらえませんか?

#include <stdio.h>

int main() {
  printf("sizeof(int) = %d\n", sizeof(int));
  return 0;
}

ちなみに私の環境 Linux/Slackware3.1 では

    sizeof(int) = 4

と出ます。


2. 以下のプログラムが

#include <stdio.h>
#include <stdlib.h>

int main() {
  printf("drand() = %f\n", drand48());
  return 0;
}

a) コンパイルできるか?
b) 結果が 0〜1 の間の小数になるか?

を試してみて下さい。


3. 以下のプログラムも同様に

#include <stdio.h>
#include <stdlib.h>

int main() {
  double d = (double)rand() / RAND_MAX;


  printf("random value = %f\n", d);
  return 0;
}

a) コンパイルできるか?
b) 結果が 0〜1 の間の小数になるか?

を試してみていただけませんか?

結果をみて対策を考えます。


-- 
古川竜雄 (frkwtto@osk3.3web.ne.jp) / FreeWnn Project