GMP句柄溢出

时间:2015-05-08 08:05:50

标签: php gmp

我有以下PHP脚本,我通过CLI调用:

#!/usr/bin/php
<?php

$max_stellen = 10;

for ($base=2; $base<=62; $base++) {
        for ($power=2; $power<=10; $power++) {
                $result = array();

                $max_base = gmp_pow($base, $max_stellen);
                $x = gmp_init(0);

                while ((gmp_cmp($x, $max_base) == -1)) {
                        $val = gmp_strval($x, $base);
                        $i = strlen($val);

                        $left  = gmp_pow($x, $power);
                        $right = gmp_pow($base, $i);
                        $mod   = gmp_mod($left, $right);
                        if (gmp_cmp($mod, $x) == 0) {
                                $result[] = $val;
                        }
                        unset($left);
                        unset($right);
                        unset($mod);

                        $x = gmp_add($x, 1); // !!! line 30
                }

                unset($x);
                unset($max_base);

                $res2 = array();
                foreach ($result as &$r) {
                        $root = substr($r, -1);
                        $res2[$root][] = $r;
                }
                unset($result);

                foreach ($res2 as $root => &$r) {
                        echo "X^${power}_${base}($root) = {".implode(', ', $r)."}\n";
                }
                unset($res2);

                echo "\n";
        }
}

在短时间内(值base=6, power=9),我收到以下错误消息:

PHP警告:gmp_add(): - 2147483648不是......第30行的有效GMP整数资源

如果我用base=6, power=9手动运行代码,它可以正常工作,所以错误只发生在循环多次运行时。

错误消息听起来像是分配了GMP句柄,当它们不再使用时不会被释放。所以在很短的时间之后,句柄超出了整数范围。但是如何释放GMP句柄呢?我已尝试在任何地方使用unset(),但gmp_free()gmp_destroy()等功能不存在。

更新

向PHP报告了问题,因为我认为这不是预期的行为:https://bugs.php.net/bug.php?id=69702

0 个答案:

没有答案