質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3867閲覧

CentOS7.3でphp5.3.29をソースからビルドしたときに警告が出る

sleepsheep

総合スコア310

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2017/05/30 09:52

CentOS7.3上でphp5.3.29をソースコードからコンパイルしてインストールしようとしています。コンパイルしたときに、警告メッセージが出力されるのですが、これらを無くしてビルドできるようにすることは可能でしょうか。

例えば、以下のようなメッセージが出力されます。

/usr/local/src/php-5.3.29/ext/dom/document.c: 関数 ‘zif_dom_document_import_node’ 内: /usr/local/src/php-5.3.29/ext/dom/document.c:1214:5: 警告: passing argument 2 of ‘dom_get_ns’ discards ‘const’ qualifier from pointer target type [デフォルトで有効] nsptr = dom_get_ns(root, nodep->ns->href, &errorcode, nodep->ns->prefix); ^ In file included from /usr/local/src/php-5.3.29/ext/dom/document.c:28:0: /usr/local/src/php-5.3.29/ext/dom/php_dom.h:109:10: 備考: expected ‘char *’ but argument is of type ‘const xmlChar *’ xmlNsPtr dom_get_ns(xmlNodePtr node, char *uri, int *errorcode, char *prefix); ^ /usr/local/src/php-5.3.29/ext/dom/document.c:1214:5: 警告: passing argument 4 of ‘dom_get_ns’ discards ‘const’ qualifier from pointer target type [デフォルトで有効] nsptr = dom_get_ns(root, nodep->ns->href, &errorcode, nodep->ns->prefix); ^ In file included from /usr/local/src/php-5.3.29/ext/dom/document.c:28:0: /usr/local/src/php-5.3.29/ext/dom/php_dom.h:109:10: 備考: expected ‘char *’ but argument is of type ‘const xmlChar *’ xmlNsPtr dom_get_ns(xmlNodePtr node, char *uri, int *errorcode, char *prefix); ^ /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c: 関数 ‘_php_pgsql_notice_handler’ 内: /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c:818:3: 警告: 互換性のないポインタ型から 2 番目の ‘_php_pgsql_trim_message’ の引数に渡しています [デフォルトで有効] notice->message = _php_pgsql_trim_message(message, &notice->len); ^ /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c:731:15: 備考: expected ‘int *’ but argument is of type ‘size_t *’ static char * _php_pgsql_trim_message(const char *message, int *len) ^ /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c: 関数 ‘php_pgsql_result2array’ 内: /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c:6272:7: 警告: 互換性のないポインタ型から 3 番目の ‘php_addslashes’ の引数に渡しています [デフォルトで有効] data = php_addslashes(element, element_len, &data_len, 0 TSRMLS_CC); ^ In file included from /usr/local/src/php-5.3.29/ext/standard/php_standard.h:23:0, from /usr/local/src/php-5.3.29/ext/pgsql/pgsql.c:37: /usr/local/src/php-5.3.29/ext/standard/php_string.h:123:14: 備考: expected ‘int *’ but argument is of type ‘size_t *’ PHPAPI char *php_addslashes(char *str, int length, int *new_length, int freeit TSRMLS_DC); ^ /usr/local/src/php-5.3.29/ext/sqlite/libsqlite/src/func.c: 関数 ‘minmaxFunc’ 内: /usr/local/src/php-5.3.29/ext/sqlite/libsqlite/src/func.c:38:10: 警告: ポインタから異なるサイズの整数へのキャストです [-Wpointer-to-int-cast] mask = (int)sqlite_user_data(context); ^ /usr/local/src/php-5.3.29/ext/sqlite/libsqlite/src/func.c: 関数 ‘minmaxStep’ 内: /usr/local/src/php-5.3.29/ext/sqlite/libsqlite/src/func.c:526:10: 警告: ポインタから異なるサイズの整数へのキャストです [-Wpointer-to-int-cast] mask = (int)sqlite_user_data(context); ^

64bitのOS上でコンパイルしたために、int(4byte)とポインタ(8byte)のサイズが違っていることが原因のように思われるものや、ソースコードで関数宣言と異なる型の引数を指定しているものなど、数種類の警告が出てしまいます。

gccで "-m32" という32bit環境用にint,long,ポインタが4byteでコンパイルされるオプションがあったので、「make CC="gcc -m32"」と指定してmakeしてみました。変数のサイズに依る警告は出なくなりましたが、代わりに以下のような警告が大量に出るようになりました。

/usr/local/src/php-5.3.29/ext/hash/hash_sha.c:714:2: 警告: 大きな整数が暗黙に符号無し型に切り詰められました [-Woverflow] L64(0xc6e00bf33da88fc2), L64(0xd5a79147930aa725), L64(0x06ca6351e003826f), L64(0x142929670a0e6e70),

これらの警告を無くしてコンパイルしたいのですが方法が分かりません。
configureやmakeのオプションで無くすことができるのでしょうか。
もしくは警告が出たままでも動作に支障がないものなのでしょうか。

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

趣味で(?)PHPの色々なバージョンをビルドしていますが、警告はたいてい大量に出ますね。
多くの場合、昔のコンパイラでは見過ごされていた「潜在的な問題」がコンパイラのバージョンが上がることで顕在化して警告として表示されるようになったとか、新しいC/C++言語の規格で、昔流の書き方が認められなくなったというものです。
ソースコードに問題があるわけなので、コンパイラオプション等で警告表示を消しても、問題が解決しているわけではありません。ビルドできているのなら、さしあたりは気にしないか、もし本当に警告をなくしたいのであれば、ソースコードにパッチをあてることになります。
「警告が出たままでも動作に支障がない」と断言することはできませんが、、CentOS7.3はメジャーなディストーションなので、もし問題があれば話題になって修正されるでしょうから、さしあたりはそのまま使うしかないと思います。
ところで、PHP 5.3.29はかなり古い、脆弱性のあるバージョンですが、それを承知の上で脆弱性があってもさしつかえない使い方をするのですよね。気になったので念のため。

投稿2017/05/30 23:57

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alg

2017/05/31 00:31

ディストーション → ディストリビューション でしょうか?
ockeghem

2017/05/31 02:20

はい、そうです。ご指摘ありがとうございます。
sleepsheep

2017/05/31 12:49

コンパイラのバージョンなどの理由で、やはり警告は出てしまうのですね。 警告の中でも、ポインタ引数の型が違うというものはそのままでも問題ないかと思いましたが、ポインタをサイズの異なるintにキャストしているのは、桁落ちにより参照先が変わってしまうのではないかということが気になっています。 仰る通り、PHP5.3は古いバージョンですが、Windowsサーバー上で稼働しているシステムをLinuxサーバーで動作させるための検証をしていまして、Windows上で使用していたPHPと同じ5.3.29のバージョンを入れようと思いコンパイルしていました。 古いPHPを最新のCentOSにインストールするというケースが稀なのか、関連する情報を見つけることができず質問させていただきました。
sleepsheep

2017/06/01 00:42

PHPの色々なバージョンをビルドされていると書かれていましたので重ねてお聞きしたいのですが、新しいバージョンのPHPの方が警告も少なかったりするのでしょうか?
ockeghem

2017/06/01 01:05

新しい方が確実に警告は少ないですね。試みにPHP 7.1.5を手許でビルドしてみましたが、warning:1 note:3 程度でした。逆に、極端な例ですが、PHP 5.0 とか PHP 5.1等では警告どころかエラーになるので、ソースにパッチをあてるとか、古いライブラリをインストールするとかしないとビルドできません。傾向としては、新しいバージョンほど警告は少ないと言えると思います。
sleepsheep

2017/06/01 05:35

私の方でも検証に使用していたCentOS7.3の環境で、PHP5.4.45をコンパイルしてみました。 教えていただいたように、警告の数はゼロとはなりませんが少なくなったみたいです。ソースのロジック自体が変わっているようですが、ポインタからintへのキャストの警告も出なくなっていました。 CentOS7.3での標準のyumではPHP5.4.16なので、それより古いバージョンを使う場合はOSのバージョンを下げないと難しいのでしょうか?
ockeghem

2017/06/01 08:11

「CentOS7.3での標準のyumではPHP5.4.16」というのは、元となったRHELで「たまたま」そのバージョンを選択したに過ぎず、このバージョンにこだわる根拠はありません。多くの場合、警告はあまりに気にする必要はありません。今回のポインタ→intのキャストも、ポインタ(64ビット)→int(32ビット)→ポインタ(64ビット)というキャストなら危険極まりない…というか動かないですが、そういうものではなく、単にトリッキーな書き方をしたということのようですので、おそらく大丈夫ではないでしょうか? PHP 5.3.xを「安全に使う」ための一番ラクな方法は、CentOS6の標準PHP (PHP 5.3.3)を使うことですが、5.3.29をどうしても使う必要があるなら、細かいことにこだわっても仕方ない気がします。どっちみち脆弱性があるのでクリティカルな用途には使えないわけですから
sleepsheep

2017/06/02 02:33

ポインタからintへのキャストで警告が出ている箇所を見てみると、intの値として使用しているみたいなので、仰るように問題ないようにみえますね。 改めてメッセージを確認してみると、上記の警告はsqliteの拡張モジュールで出ていました。今回検証しているシステムではsqliteは使っていないので、システムの動作に支障はないと判断し、このバージョンのPHPでまずは検証を進めたいと思います。 何度も丁寧な回答をいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問