check-invalid-reads

在编译过程中, 这个标志将强制检查类型来检测无效的读取。 这可确保使用默认值 (以及内部指针) 正确定义和初始化所有变量。 一个例子:

  1. namespace Acme;
  2. class ForInRange
  3. {
  4. public static function forEmpty(var n)
  5. {
  6. var i;
  7. for i in range(1, n) {
  8. // Do something
  9. }
  10. }
  11. }

与之比较:

  1. namespace Acme;
  2. class ForInRange
  3. {
  4. public static function forEmpty(var n)
  5. {
  6. var i = null;
  7. for i in range(1, n) {
  8. // Do something
  9. }
  10. }
  11. }

就Zephir 而言, 这两个例子都是完全有效的。 不同之处在于生成的 c 代码:

  1. zval *n;
  2. // ...
  3. zephir_fetch_params(1, 1, 0, &n);

与之比较:

  1. zval *n = NULL;
  2. // ...
  3. zephir_fetch_params(1, 1, 0, &n);

对于任何编程语言, 始终使用默认值和类型初始化变量是一种很好的做法。 不这样做, 可能会给应用程序带来意想不到的后果, 并引入错误、内存泄漏等。 通过在config.json 中使用 check-invalid-read标志我们确保指针和它们各自的C变量被正确初始化。 Zephir 开发人员不会看到他们的代码发生更改。 这将影响生成的C代码。

关于为什么C指针需要在Stack overflow here 中无效的更多信息。