[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 メーリングリストの案内