美文网首页
zend_string_dup 也有坑?

zend_string_dup 也有坑?

作者: Bun_Wong | 来源:发表于2016-07-15 20:50 被阅读107次

今天在写 Azalea 的时候,无意中遇到一个奇怪的 bug,代码片段如下

$testModel = $this->getModel('test');
$testModel->test();
var_dump('test');

getModel 是 Controller 方法用于获取 Model,$testModel 确实已经获取回来了,但是 $testModel->test() 出错了,同时 var_dump('test') 输出了 "Test",基本上定位到了 getModel方法中的把传入名称首字母大写而影响了 Model 类名的位置

zend_string *modelName, *name, *modelClass;

if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "S", &modelName) == FAILURE) {
    return;
}

name = zend_string_dup(modelName, 0);  // 复制一份传入的名称
ZSTR_VAL(name)[0] = toupper(ZSTR_VAL(name)[0]);  // 首字母大写
modelClass = strpprintf(0, "%sModel", ZSTR_VAL(name));  // 连接生成类名
zend_string_release(name);  // 释放 name

乍看没发现什么问题,最大嫌疑是 zend_string_dup 方法,跟踪进入源代码,

static zend_always_inline zend_string *zend_string_dup(zend_string *s, int persistent)
{
    if (ZSTR_IS_INTERNED(s)) {
        return s;
    } else {
        return zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent);
    }
}

问题就出在 ZSTR_IS_INTERNED 宏,它判断了 zend_stirng 结构中的 gc.u.v.flags 值是否等于 IS_STR_INTERNED,即字符串是否为内部的。
因为 modelName 是指向参数栈传入的第一个字符串,因此并不会产生 zend_string_init

===== 更新 =====
这个坑罪魁祸首是 opcache,启动了 opcache 之后缓存了传入字符串 "test" 是放到了同一个内存块里,即 getModel('test')var_dump('test'),都是同一个 "test",如果禁用了 opcache 不会踩到该坑。

相关文章

  • zend_string_dup 也有坑?

    今天在写 Azalea 的时候,无意中遇到一个奇怪的 bug,代码片段如下 getModel 是 Controll...

  • 订机票也有坑

    最近我要去北京帮女儿装修房子,前天早上和女儿、先生商量好出发日期,就开始订机票。 那么,订机票前应该注意哪些事项呢...

  • 做核酸也有坑

    疫情期间,外出人员不仅要报备,还要做核酸。大多数医院方便群众一天24小时进行核酸检测,一次十元。 今天听一位大姐说...

  • 如今的理财也有“坑”

    文/家宁爱健康 去年的2月18日在农行买了一个“春节专享”的1年期理财产品,利息不算高4.25%,但是稳健啊!因为...

  • RN

    有坑 官网有坑 博主文档也有坑 填坑的博主文档还有坑 ... 泪奔了 泪奔了 泪奔了 泪奔了 泪奔了 泪奔了 泪奔...

  • 我的入坑历程

    入坑产品的人,很多,之所以入坑想必也有自己的原因。正经的原因也有,当然没正经的原因,我也可以理解,毕竟妹纸多嘛。不...

  • 曹溪散记 邹金龙

    一、黄坑天池 没到黄坑,我先把黄坑好好的想了个遍。因为在我的故乡连城四堡也有个美丽的乡村叫黄坑村,那曹...

  • 旅途

    每个人的人生中都会有许许多多的坑,这些坑不同的坑,有带给你好运的,也有带给你厄运的。 在旅途中,我...

  • 成熟之美——和田玉里的“老坑料”

    玩家们在玩玉时常常会接触到“老坑料”这个词,和翡翠一样,和田玉也有老坑料这种说法,那么什么是老坑料,老坑料又有哪些...

  • transform造成的文字抖动模糊

    解决方法加上translateZ(0) CSS3硬件加速也有坑

网友评论

      本文标题:zend_string_dup 也有坑?

      本文链接:https://www.haomeiwen.com/subject/clwyjttx.html