[Freewnn-users 171] Re: _XOPEN_SOURCE を定義してconfigure してみました。(Re: make 'CCOPTIONS=-g' と指定するとatodがSEGVで落ちるようになる)

Back to archive index

ISHIKAWA,chiaki ishik****@yk*****
2013年 8月 26日 (月) 23:48:49 JST


(2013/08/26 21:14), 1xx wrote:
> 2013年8月26日 19:17 ishikawa <ishik****@yk*****>:
>>
>> env CC="c-compiler-program -D_XOPEN_SOURCE=550" ./configure
>> のようにして、コンパイルしてみたところ、(gcc-4.8  をコンパイラとして利用
>> し、 make CCOPTIONS="-Werror -Wall" でコンパイル。)
>>
>> いくつか(多分これまでコンパイルされていなかった部分で?) 問題がみつかりま
>> した。
> 
> 作業ご苦労様です。
> そしてありがとうございます。
> 
> 気になったところにだけcommentいたします。
> 
>>
>> その他 bzero(), bcopy(), bcmp(), rindex() が <strings.h> で定義されているの
>> に、<strings.h> が正しくinclude されない問題を発見、修正:
>> たとえば etc/bdic.c ですと次のような問題がありました:
>> 下にcpp でのinclude 部分を示しますが
>> 要は、STDC_HEADERSが定義されている、いないに関わらず strings.h があれば存在
>> すれば
>> 問答無用でstrings.h をinclude すべきです。いくつか同じような問題をかかえた
>> ファイルを修正しました。(コンパイル時に警告がでないファイルは修正しきれてい
>> ません。INET6 などが定義されているとbcopy が使われるファイルなどは未修正のも
>> のもあるかもしれません。)
> 
>   bzero(), bcopy(), bcmp(), rindex() に関しては、おいおい
> memset(), memcpy(), memcmp(), strrchr()等に置き換えないといけないかなと
> 漠然と考えておりました。
> 
>>
>> ですが、gcc-4.8 の警告の不便なところは、if (a = b )のように、"=" 一つしかな
>> く、他に&& とか || がないにも括弧をつけろと警告されてしまいます。(上の実例
>> (b) は ==がある事例)
>>   テスト目的で -Wall -Werror をつけていたために、コンパイルが先にすすめず, こ
>> れを  if ((a = b) ) のように修正してしまいましたが、あまりうれしくない変更です。
> 
> 代入しながら比較するコードに関して、
> 数値ならif ((a = b) != 0)
> pointerならif ((a = b) != NULL)
> と私は書くことにしています。
> 但し、既にあるif (a = b)に関しては、可能な限り変更しないことにしています。
> 本当に代入したかったのか、比較したかっただけなのか即断できないからです。

そうなんです。私も変更したくなかったのですが、gcc-4.8 で
-Werror -Wallでチェックをすすめるためにやむをえず
変更しました。
(選択的にできるのかな? -Wno-parenthesisとかすればよかったのかも。)

> 
>>
>> PS: _XOPEN_SOURCE=550 は最初 650で定義しておこなったのですが、
>> いくつかの関数が 600 以上では宣言、定義されないということがわかったので
>> 550に落したものです。数箇所かそれでもうまく宣言、定義されず
>> 無理矢理 __USE_BSD を局所的に 定義して宣言を取り込んでいるところがあります
>> が、_XOPEN_SOURCE は crypt() の利用に問題があったために定義したもので、他に
>> は大きな問題を与えてないはずです。
>> (とりあえず jserver は動作してますし。)
> 
> _XOPEN_SOURCEを定義すると宣言されなくなるのは、
> 多分、bcopy')系の関数ではないでしょうか?
> 先述したようにbcopy()系の関数は<string.h>の関数で
> 置き換えたら良いのかなと思っています。
> 
たしかに、私も
bzero, bcopy, bcmp はmemset, memmove, memcmpで置き換えるのが良いかとおもいながら
作業してました。

rindexなんてのが入っていたのは古いソースの由縁でしょうか。

さきに述べたようなあまり好ましくない変更も-Werrorのチェックのためやむを得ずいれていますが、
 - Debian 用のパッチをあらかじめあてて、
 - OpenSuseのパッチをあて(設定ファイル、辞書ファイルのレイアウトとja_JP -> jaの変更は除いた)
 - gcc 4.8 -Wall -Werrorでコンパイルできるように極力 引数のミスマッチはキャストをし、
  かつ一部は変更をし、
 - さらに -D_XOPEN_SOURCE=550 でconfigureしてもコンパイルできるように修正しました。

トップレベルに 
 ./do-xopen.sh     configureの際に -D_XOPEN_SOURCE=550を指定
 ./do-generic.sh    上記の指定なし。
の二つのスクリプトがあります。

64ビット Debianの上で上記の二つのスクリプトのコンパイルが問題なくできて、
do-xopen.sh のバージョンのjserverで問題なく変換できています。

(もともと 32bits の上でつくりましたが、再度見直して少しきれいにしたのと、
一箇所 sizeof() のからんだ計算の結果を printf で%dを使って出力しようとしていましたが、
64bitsだと %lu (ld?) でないとタイプミスマッチ するので、そのような編集をしました。
ひょっとすると32ビットだと、ここで再度警告でるかもしれません。うーむ。

*.[ch] ファイルの変更は参考になると思います。

https://bitbucket.org/zephyrus00jp/freewnn-1.1.1-a022-debian-0827

においてみました。とりあえずご参考まで。

石川




freewnn-users メーリングリストの案内
Back to archive index