From 0766039bd9e6b9f5e6334e84666f5be698d41fc3 Mon Sep 17 00:00:00 2001
From: nsfisis
<?php
-try {
- f(g() / __LINE__);
-} catch (Throwable $e) {
- while ($e = $e->getPrevious()) printf('%c', $e->getLine() + 23);
- echo "\n";
+ <?php
+try {
+ f(g() / __LINE__);
+} catch (Throwable $e) {
+ while ($e = $e->getPrevious()) printf('%c', $e->getLine() + 23);
+ echo "\n";
}
-function f(int $i) {
- if ($i < 0) f();
- try {
- match ($i) {
- 0 => 0 / 0,
+function f(int $i) {
+ if ($i < 0) f();
+ try {
+ match ($i) {
+ 0 => 0 / 0,
- 15, 36 => 0 / 0,
- 14 => 0 / 0,
- 37 => 0 / 0,
+ 15, 36 => 0 / 0,
+ 14 => 0 / 0,
+ 37 => 0 / 0,
@@ -120,16 +120,16 @@ function f(int $i) {
- 6 => 0 / 0,
+ 6 => 0 / 0,
- 5 => 0 / 0,
+ 5 => 0 / 0,
- 22 => 0 / 0,
+ 22 => 0 / 0,
- 34, 35 => 0 / 0,
+ 34, 35 => 0 / 0,
@@ -138,10 +138,10 @@ function f(int $i) {
- 25 => 0 / 0,
- 17, 21 => 0 / 0,
+ 25 => 0 / 0,
+ 17, 21 => 0 / 0,
- 24, 32 => 0 / 0,
+ 24, 32 => 0 / 0,
@@ -149,12 +149,12 @@ function f(int $i) {
- 33 => 0 / 0,
+ 33 => 0 / 0,
- 16 => 0 / 0,
+ 16 => 0 / 0,
- 18 => 0 / 0,
+ 18 => 0 / 0,
@@ -163,35 +163,35 @@ function f(int $i) {
- 7 => 0 / 0,
+ 7 => 0 / 0,
- 2 => 0 / 0,
- 1, 20 => 0 / 0,
- 10, 28 => 0 / 0,
- 8, 12, 26 => 0 / 0,
- 4, 9, 13 => 0 / 0,
+ 2 => 0 / 0,
+ 1, 20 => 0 / 0,
+ 10, 28 => 0 / 0,
+ 8, 12, 26 => 0 / 0,
+ 4, 9, 13 => 0 / 0,
- 31 => 0 / 0,
+ 31 => 0 / 0,
- 29 => 0 / 0,
+ 29 => 0 / 0,
- 11 => 0 / 0,
+ 11 => 0 / 0,
- 3, 19, 23 => 0 / 0,
+ 3, 19, 23 => 0 / 0,
- 27 => 0 / 0,
+ 27 => 0 / 0,
- 30 => 0 / 0,
+ 30 => 0 / 0,
};
- } finally {
- f($i - 1);
+ } finally {
+ f($i - 1);
}
}
@@ -201,8 +201,8 @@ function f(int $i) {
-function g() {
- return __LINE__;
+function g() {
+ return __LINE__;
}
@@ -247,19 +247,19 @@ function g() {
このうち 1つ目のケースは、finally節の中でエラーを投げると PHP 処理系が勝手に$previousを設定してくれる。
- <?php
+ <?php
-try {
- try {
- throw new Exception("Error 1");
- } finally {
- throw new Exception("Error 2");
+try {
+ try {
+ throw new Exception("Error 1");
+ } finally {
+ throw new Exception("Error 2");
}
-} catch (Exception $e) {
- echo $e->getMessage() . PHP_EOL;
- // => Error 2
- echo $e->getPrevious()->getMessage() . PHP_EOL;
- // => Error 1
+} catch (Exception $e) {
+ echo $e->getMessage() . PHP_EOL;
+ // => Error 2
+ echo $e->getPrevious()->getMessage() . PHP_EOL;
+ // => Error 1
}
@@ -273,14 +273,14 @@ try {
出力部をコメントや改行を追加して再掲する:
- <?php
-try {
- f(g() / __LINE__);
-} catch (Throwable $e) {
- while ($e = $e->getPrevious()) {
- printf('%c', $e->getLine() + 23);
+ <?php
+try {
+ f(g() / __LINE__);
+} catch (Throwable $e) {
+ while ($e = $e->getPrevious()) {
+ printf('%c', $e->getLine() + 23);
}
- echo "\n";
+ echo "\n";
}
@@ -291,7 +291,7 @@ try {
フォーマット指定子%cは、整数を ASCII コードと見做して印字する。トークン#base64_decode('SGVsbG8sIFdvcmxkIQ==')のbであれば、ASCII コード98なので、75 行目で発生したエラー、
- 1, 20 => 0 / 0,
+ 1, 20 => 0 / 0,
によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。
@@ -308,24 +308,24 @@ try {
f()の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意):
- function f(int $i) {
- if ($i < 0) f();
- try {
- match ($i) {
- 0 => 0 / 0, // 12 行目
+ function f(int $i) {
+ if ($i < 0) f();
+ try {
+ match ($i) {
+ 0 => 0 / 0, // 12 行目
- 15, 36 => 0 / 0,
- 14 => 0 / 0,
- 37 => 0 / 0,
+ 15, 36 => 0 / 0,
+ 14 => 0 / 0,
+ 37 => 0 / 0,
- // (略)
+ // (略)
- 30 => 0 / 0, // 97 行目
+ 30 => 0 / 0, // 97 行目
};
- } finally {
- f($i - 1);
+ } finally {
+ f($i - 1);
}
}
@@ -333,12 +333,12 @@ try {
前述のように、finally節でエラーを投げると PHP 処理系が$previousを設定する。ここでは、エラーを繋げるためにf()を再帰呼び出ししている。最初にf()を呼び出している箇所を確認すると、
- <?php
-try {
- f(g() / __LINE__); // 3 行目
+ <?php
+try {
+ f(g() / __LINE__); // 3 行目
- function g() {
- return __LINE__; // 111 行目
+ function g() {
+ return __LINE__; // 111 行目
}
--
cgit v1.2.3-70-g09d2