17

次の作業コードがあります。

$test = '123456';

$int = preg_match('/^\d+$/', $test, $matches);

print_r(array($int, $matches));

ただし、コードパッドで実行すると、エラーが発生します。

警告: preg_match(): 5 行目の内部 pcre_fullinfo() エラー -3

しかし、コードは自分のマシンで実行されています(コードは問題ないはずです)。

将来的にコードを配布する必要があるため、構成によっては壊れてしまうと悪いでしょう。では、コードパッドが壊れる理由は何ですか?

4

1 に答える 1

30

codepad を介して実行されるコードは、非常に制限された環境で実行されます。

コードの実行は、geordi に基づくスーパーバイザによって処理されます。戦略は、すべてを ptrace の下で実行し、多くのシステム コールを禁止または無視することです。コンパイラーと最終的な実行可能ファイルは、厳密なリソース制限のある chroot 監獄で実行されます。スーパーバイザは Haskell で書かれています。

正規表現エンジンを壊すことは期待できませんが、コードパッド環境によってブロックされているものを pcre ライブラリが内部で使用している可能性は非常に高いです。このような厳しい制限を使用する運用システムはないため、アプリケーションでそのコードを安全に使用する必要があります。

エラー コードは、「PCRE_ERROR_BADOPTION -無効だった値」を表します。ただし、エラーが発生する PHP ソースのコードは、whatrc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats);に定数を使用しています。したがって、pcre ライブラリが codepad で壊れていることは明らかです。

完全に安全にしたい場合は、libpcre を使用して小さな C プログラムを作成し、同じ正規表現でその関数を呼び出すことができます。

于 2012-01-14T01:24:16.153 に答える