check-invalid-reads
在编译过程中, 这个标志将强制检查类型来检测无效的读取。 这可确保使用默认值 (以及内部指针) 正确定义和初始化所有变量。 一个例子:
namespace Acme;
class ForInRange
{
public static function forEmpty(var n)
{
var i;
for i in range(1, n) {
// Do something
}
}
}
与之比较:
namespace Acme;
class ForInRange
{
public static function forEmpty(var n)
{
var i = null;
for i in range(1, n) {
// Do something
}
}
}
就Zephir 而言, 这两个例子都是完全有效的。 不同之处在于生成的 c 代码:
zval *n;
// ...
zephir_fetch_params(1, 1, 0, &n);
与之比较:
zval *n = NULL;
// ...
zephir_fetch_params(1, 1, 0, &n);
对于任何编程语言, 始终使用默认值和类型初始化变量是一种很好的做法。 不这样做, 可能会给应用程序带来意想不到的后果, 并引入错误、内存泄漏等。 通过在config.json
中使用 check-invalid-read
标志我们确保指针和它们各自的C变量被正确初始化。 Zephir 开发人员不会看到他们的代码发生更改。 这将影响生成的C代码。
关于为什么C指针需要在Stack overflow here 中无效的更多信息。