• check-invalid-reads

    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 中无效的更多信息。