Upgrade to Pro — share decks privately, control downloads, hide ads and more …

php-srcにバグ報告をしてみよう - でかいソフトウェアのバグを見つけよう -

php-srcにバグ報告をしてみよう - でかいソフトウェアのバグを見つけよう -

php-srcのバグを見つけてみませんか?
とはいえ、大規模なオープンソースソフトウェアのバグを見つけるときに、切り出すのがすごく難しいので、ノウハウを共有してみたいです。

PHPカンファレンス2021
https://phpcon.php.gr.jp/2021/

てきめん tekimen

October 02, 2021
Tweet

More Decks by てきめん tekimen

Other Decks in Programming

Transcript

  1. 自己紹介 てきめん • https://tekitoh-memdhoi.info • @youkidearitai • https://www.youtube.com/user/tekitohmrp php-srcでバグ2個見つけました •

    https://bugs.php.net/bug.php?id=77165 • https://bugs.php.net/bug.php?id=80771 オンラインでしかできないことだと思うのでこの姿でやります
  2. 見つけるのは難しい 2 • 巨大なOSSは見つかっていないバグがあるが – 巨大すぎる!! • 総ステップ数でいうと1200000くらい(PHP 8時点)あるよね •

    どうバグを見つければいいんだ…と立ち尽くすしかない 何かしらのアプローチを変える必要がありそうだ
  3. 見つけるのは難しい 3 • 巨大であるにもかかわらず、大規模にコードが変更される – Zend Engineもがらりと変わるし • extension書いてると、Cの関数削除されててバージョン移したら動かな いじゃん!?とかなる

    – extensionもがらりと変わるし • 特にmbstringとかすごい変わる(major overhaul of mbstringとか) • 他にもたくさんあると思う(理解しきれない) ユーザーランドでは後方互換性はあるけどinternalsは違う
  4. 見つけるのは難しい 5 • バグをバグと定義するのが難しい – マニュアルや仕様にない挙動をどうするのか? – is_float(-9223372036854775808);がtrueになるのはなぜ? • これはバグじゃない(えーっ!?)(”-”と”9223372036854775808”が分割された

    トークンとして解釈される仕様のため) • もちろん、こういうのをbugs.php.netに残してくれると助かる、本当のバグは bugs.php.netで見つからないから – 貴重な例: https://bugs.php.net/bug.php?id=78081 – ※RFCによる同意が得られればこちらが仕様になるかもしれない: https://github.com/php/php-src/pull/6147 明らかなsegfaultなどを除いて間違っていると言えるか?
  5. 特徴の理解の仕方 2 • 特徴を理解する方法として写経がある –ソースコードの写経をしている、したリスト • var_dump –zval構造体の理解に役に立った • debug_print_backtrace

    –バックトレースの理解に役に立った • phpinfo –MINFOなど、設定方法などがわかった php-srcがわからないならphp-srcを写経すれば良い
  6. バグ 私は間違っている VS 歴史 コードの 間違い オレは 間違っている 18年 潜んでいた

    バグ phpcredits()は 正常に動いてる マニュアルは phpcredits()を 参照しろとある PHPが 間違っている はずがない 仮にバグだった として、 後方互換性は? どこかに 仕様である 証拠はない?
  7. バグを指摘した後の影響? 1 • 長きにわたるバグを見つけ出して報告したらどうなるのか – (たまたまなのかわかりませんが)連鎖的に見つかります • https://bugs.php.net/bug.php?id=80915 • https://bugs.php.net/bug.php?id=81048

    Bug #80915 $foo =& $_SERVER; \phpinfo(INFO_VARIABLES); // $_SERVERがなくなる print_r($_SERVER); Bug #81048 array_walk($_SERVER, function($value, $key) { }); // Array to string conversionが出る phpinfo(INFO_VARIABLES);
  8. Fix Typoという貢献 • バグの一つに、ソースコードに変数名やコメントにtypoがある – 「Fix typo」のようなtypoを修正するPull Requestはよくある – ソースコードを目を皿のように読まないとわからない

    • 修正する側もすごいし、受け入れてる側もすごい – 変数名、コメント程度で挙動に影響しないものは、CIをスキップ できるので、「[skip-ci] Fix typo」のようなコミットが多かった typoの修正も貴重な貢献の一つです!
  9. 変な変更を監視する必要とは • 2021年3月末、バックドアが仕掛けられる事件があった – [skip-ci] Fix typoでCIをスキップでき、たくさんあったFix typoの一つと して紛れ込ませた –

    つまり、「Fix typo」の貢献を悪用しながら、CIと人間の目をかいくぐり、 バックドアを仕掛けようとしたという巧妙なもの • masterへのコミットなので、実被害はphp-srcを開発してる、とか じゃないとないでしょう。 • 自分が気がついたときは「Revert: Revert: Revert... 」のよう に、Revertが繰り返されたPull Requestがあったとき
  10. この事件の影響 • PHP 7.4.17 と 8.0.4 がスキップされる(欠番になる) – RC1が出てから2週間のうちにリリースとなるのが通常 •

    この事件の検証をしてて4週間分の修正を反映とするのは厳しかったため – 私のみつけたphpinfoのバグ(#80771)がスキップされた(´・ω・`) • git.php.netが閉鎖され、GitHubのほうを使うようになった • かなりたくさんあったFix typoが少なくなった(と思う) – 実は、同時期に機械的に見つける手法で大量のtypoを修正するPull Request も一因(今コレをやるべきじゃないと思うけど(拙訳)ってあるけどありがたい) • https://github.com/php/php-src/pull/6822
  11. • 2019年5月ごろに3D化しました。 • コロナ禍でオンラインカンファレンスが中心になっ て、オンラインでしかできないことをやりたいと思って この姿で登壇してます。 この3Dアバターについて • MagicaVoxelとBlenderを使ってます!今なら色々なプラットフォームがあって3Dアバターを 作りやすいと思います。

    • 3Dアバターで登壇するメリットはこういうのがあります – 顔を見せる必要がない – 自分というキャラクターを出せる、好きになれる – 身振り手振りなどの応用も効かせられる(表示は3tene、手はLeap Motion使ってます)