[PHP-users 28036] Re: 整数の下限

Tadashi Jokagi ml @ elf.no-ip.org
2006年 1月 5日 (木) 18:27:06 JST


      ぢょ〜@よくきたなです.

SAISHO Kazuhiroさんの「[PHP-users 28032] Re: 整数の下限」から
>前者は zend_operators.c に、後者は zend_language_scanner.l に、
>それぞれ記述されていますね。
>でも私がそこに辿り着けたのは、大垣さんからご提示戴いたコードを
>キーワードにしてファイルを検索したからにすぎません。
>初めに質問させて戴いたような動作が気になるからといって、
>どのソースを見ればいいかということは決して「簡単」ではないと
>思いますが、如何でしょうか?
>どうすればこのファイルのこのコードに辿り着くことができたのでしょうか?

      カンが働くようになればそんなに難しくないです.同時期にメールが
    流れたので出しませんでしたが,下記上鍵の手順です.

■最初の推測
a)適当にテスト(IRC のログ参照って見てないか
  1.スクリプトから数値化(BCD2DEC 的)なときに型評価がある
    1.1.カンでしたが正数値としていしか評価していないのではないか?
  2.演算時に型評価がある
  3.演算時の型評価後は数値化型評価に戻らない
    3.1.キャストで任意に変更はできるが例外
b)数値の評価なので,拡張モジュールではなく構文の問題だから Zend Engine
  を調べてみよう
c)a)の結果 2147483647 がキーワードだろう

$ cd php-5.1.1/Zend
$ grep -r 2147483647 .

  対象は「./zend.h」と「./zend_strtod.c」で両方「LONG_MAX」を定義
d)どちらも中を見たところぱっと見では正確な理解は不明
e)LONG_〜が他にキーワードがないか気になるので調べる

$ grep -r LONG_ .
f)LONG_SIGN_MASK が zend_operators.c にすぐに出てくるので,
  zend_operators.c を読む.ざっと見ると ZEND_API が目に付くので調べる

$ grep ZEND_API zend_operators.c
g)「ZEND_API int sub_function(...)」があるので関数を読む
  結果,演算結果によって場合によっては double に変換してると推測(他の
  演算子も大体同様)
h)演算で型変換はわかった.直値は? ってことで文字列から整数にどこかで変
  換してる? とりあえずベタなところで ANSI-C の strtol ってどっかで使っ
  てないか.

$ grep strtol .

i)ちまちま調べてると ./zend_language_scanner.l に行き着く(経過的に内部
  動作の参考になるコードがポロポロと…)その中で結局前後を見ると
  「<ST_IN_SCRIPTING>{LNUM} {」の「LNUM」が怪しい.処理も
>         zendlval->value.lval = strtol(yytext, NULL, 0);
>         if (errno == ERANGE) { /* overflow */
  なのでたぶんビンゴ.

>sizeof(long) の返り値が「4」であればしっくりいくような気がしますが、
>この「long」とはいったい何でしょうか?
>検索しようにも「long」という単語はたくさんありすぎて
>絞り込むことができません。ご教授戴けましたら幸いです。
>宜しくお願い致します。

      遠藤さんのメールにもありますが,ここまで推測するには最低限「C
    言語」の文法と挙動のある程度の理解が必要になると思います.「.l」な
    ファイルをマジメに読むなら lex(flex)が読めなければいけませんが(上
    鍵はかなり前に lex&yacc で電卓打ち込んだことがある程度なので大体
    でしか読めませんが…)

-- 
----.----1----.----2----.----3----.----4----.----5----.----6----.----7
Tadashi Jokagi/Shibuya city mailto:elf @ elf.no-ip.org
YokukitanaII http://elf.no-ip.org/
Yokukita blog http://blog.poyo.jp/
Yokukita wiki http://wiki.poyo.jp/


PHP-users メーリングリストの案内