php函数二进制安全,哪些函数php被称为不“二进制安全”?这些“非二进制安全”函数向哪些库传递字符串?为什么呢?...

传统上,有两种表示字符串的方法:使用特殊字符发送字符串结尾的信号,或将字符串长度与字符串数据一起存储。C使用前者;字符串是以空字符结尾的字符数组。但是,这有一个限制,即C中的字符串不能在任何其他地方使用空字符,只能在末尾使用空字符。

为了克服这个限制,PHP引擎使用这个结构来表示字符串:

struct _zend_string {

zend_refcounted_h gc; /* refcount struct */

zend_ulong h; /* hash value */

size_t len; /* length of string */

char val[1]; /* array of chars (using struct "hack") */

};

如您所见,php开发人员选择存储字符串的长度及其数据。

现在,如果混合使用“二进制安全”和“非二进制安全”功能,会发生什么?

考虑在编写PHP扩展时可能使用的以下C代码:

zend_string *a = zend_string_init("a\0b", /* string length */ 3, 0);

zend_string *b = zend_string_init("a\0c", /* string length */ 3, 0);

if (strcmp(a->val, b->val) == 0) {

php_printf("Strings are equal!");

}

你认为会发生什么?此代码输出“字符串相等!”但他们显然不平等。自

strcmp

不考虑字符串的长度,它是一个非二进制安全函数。

大多数C的标准库字符串函数都可以被归类为“非二进制安全”函数,因为它依赖于空终止字符。

处理时

zend_string

在扩展代码中,应该使用zend字符串函数(

zend_string_*

)而不是C的字符串库。

要修复以前的代码:

if (zend_string_equals(a, b)) {

php_printf("Equal!");

} else {

php_printf("Not equal");

}

现在正确打印“不相等”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值