advertisement

zend_parse_parametersと64bit環境

50 %
50 %
advertisement
Information about zend_parse_parametersと64bit環境
Technology

Published on March 15, 2014

Author: yoyayoya1

Source: slideshare.net

Description

zend_parse_parameters
and 64bit machine.
advertisement

zend_parse_parametersと 64bit環境 2014/03/15- “よや” <yoya@awm.jp>

自己紹介 • yoya と申します • ImageMagick ストーカーです • Flash バイナリを弄るのが趣味でした • http://sourceforge.jp/projects/swfed/

もくじ • PHP-GD imagescale が 64bit で動かない件 • C言語の引数処理 • C言語の可変長引数処理 • long の 64bit での扱い • imagescale 動きました • 不具合報告しました • 最後に

PHP-GD imagescale が 64bit で動かない件 • http://d.hatena.ne.jp/yoya/20140202/images cale \Segmentation fault/ $ php gd2scale.php azunyan.jpg Segmentation fault $data = file_get_contents($argv[1]); $im_in = imagecreatefromstring($data); $im_out = imagescale($im_in, 256, 192, IMG_NEAREST_NEIGHBOUR); imagepng($im_out, 'output.png');

• 引数の呼び出し規約 • スタックに積んで先の関数に引数を渡す C言語の引数処理 int a, x, y, z; a = foo (x ,y, z); int foo(int x ,int y, int z) { …. } z y x z y x z y z y x z yz z

C言語の型 32bit/64bit • http://ja.wikipedia.org/wiki/64ビット type LP32 ILP32 LP64 ILP64 LLP64 yoya64 char 8 8 8 8 8 8 short 16 16 16 16 16 16 int 16 32 32 64 32 64 long 32 32 64 64 32 32 long long - - 64 64 64 64 void * 32 32 64 64 64 64 Linux, MacOS C99違反 なので駄目32bit機 Windows VC++

C 言語の long • 32ビットでは int と実質同じ • 64ビットでは int と違う(かも) – Linux, Mac とかは違う(int 32bit, long 64bit) – Windows は同じらしい。(試してないけど、さっき の図ではどちらも 32ビット)

• 32bit long (int と long はどちらも 32bit) • 問題なし (宣言について突っ込まないで下さい) C言語のlong引数の罠 int a, x long y; a = foo (x ,y, z); int foo(long x ,int y) { …. } z y x z y x z y z y x z yz z

• 64bit long (int 32bit long 64bit) • マズイ けど、宣言チェックでエラーに出来る C言語のlong引数の罠 int a, x long y; a = foo (x ,y); int foo(long x ,int y) { …. } y x y x Y? Y? X?y

C言語の可変長引数処理 • 関数宣言でチェック出来ない • なので、プログラマが型に気を付けるしかな い。(一応、コンパイラ側でも頑張れる、gcc の printf は警告してくれる) Int foo(int x, int y, …)

printf (サンプル) • 使い方 • 宣言 char *x = “foo”; Int y = 10; printf(“%s¥n”, x); printf(“%s %d¥n”, x, y); printf(const char *fmt, …);

zend_parse_parameters • これも可変長引数なので、同じ問題がある zend_parse_parameters(int num, char*fmt, …)

imagescale の引数処理(再び) • <php-src>/ext/gd.c (l なのに int を渡してる) PHP_FUNCTION(imagescale) { zval *IM; int new_width, new_height = -1; gdInterpolationMethod method = GD_BILINEAR_FIXED; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|ll", &IM, &new_width, &new_height, &method) == FAILURE) { "rl|ll“ r: resource l: long “rl” or “rll” or “rlll” zval *IM; int new_width, new_height; gdInterpolationMethod method; ↑ enum (int 相当)

imagescale 動いたけど (オチ1) • http://d.hatena.ne.jp/yoya/20140202/imagescale 2 • どのmode(リサイズアルゴリズム)でも全く同じ画 像が生成される。 \ピクセル単位で完全一致/ $modeList = array(IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, IMG_BICUBIC_FIXED); <略> foreach ($modeList as $mode) { echo "mode:$mode¥n"; $im_out = imagescale($im_in, 256, 192, $mode); Imagepng($im_out, $arg.'-'.$mode.'.png'); }

imagescale 動いてない • 何故、メソッドが無視される? \goto 万歳/ ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); im_scaled = gdImageScale(im, new_width, new_height); goto finish; switch (method) { case GD_NEAREST_NEIGHBOUR: ...<略> } finish: if (im_scaled == NULL) { RETURN_FALSE; } else { ZEND_REGISTER_RESOURCE(return_value, im_scaled, le_gd); } mode に応じた 処理はここに羅列

不具合報告しました (オチ2) • https://bugs.php.net/bug.php?id=66625 • 一ヶ月以上経つけど反応なし! \まさかのスルー/

最後にまとめ • 64bit で動かない場合は、 zend_parse_parameters を疑ってみるのも良 いのでは。(提案) • あと、バグを見つけたら登録しましょう。例え 反応なくても。

もう一つオチ • http://sourceforge.jp/projects/swfed/ • これも同じ問題がありました。0.62 リリース!

以上です

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

生物多様性と食・農・環境 - Food

1. zend_parse_parametersと 64bit環境 2014/03/15- “よや” 2.
Read more

第五回闇PHP勉強会 - Feelin' Kinda Strange

@yoyaさん 「zend_parse_parameters と 64bit環境 ...
Read more

11/22に第六回闇PHP勉強会を開催します ...

@yoyaさん 「zend_parse_parametersと64bit環境 ...
Read more

第五回闇PHP勉強会 - dots. [ドッツ]

セッション. 現在セッション情報整理中... @chobi_eさん 「入門Zend Memory Manager」20分
Read more

hnwの日記

PHP7でプログラム解釈時に構築される抽象構文木(AST)を可視化してみよう、という話題でした。僕はPHP7のASTはopcode ...
Read more