《Python源码剖析》笔记ShowCharacter()

本文记录了一位开发者在学习Python源码时,尝试修改PyStringObject的`string_length`函数并添加`ShowCharacter()`功能的过程。通过在`string_length`中添加条件判断避免了程序卡死的问题,实现了当字符串长度大于500时展示字符缓冲区引用变化的功能。这一探索揭示了Python内部执行机制和源码修改的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前学习到第三章PyStringObject的内容,在最后一小节Hack PyStringObject操作的时候,作者并没有给源代码,或者说没有直接说明如何修改源代码,这里是我的一些探索。
运行环境:
window10
vs2010
python2.7.13,编译的是PC目录里面的VS9.0的项目

这是原文中的描述:
在这里插入图片描述
作者说是通过在string_ength中添加代码,而这个函数实际上是这样的:

static Py_ssize_t
string_length(PyStringObject *a)
{
    return Py_SIZE(a);
}

同时,我在stringobject.c文件中找不到ShowCharacter()函数,于是我打算自己写一个,然后加入string_length()函数,看看执行len()的结果,代码如下:

static Py_ssize_t
string_length(PyStringObject *a)
{
	ShowCharacter();
    return Py_SIZE(a);
}

其中ShowCharacter()代码和原文一致,但是这样编译出来的python,会在打开的时候卡死,然后退出,我猜是ShowCharacter()的问题,于是在前面输出一行文字:

static Py_ssize_t
string_length(PyStringObject *a)
{
	printf("begin");
	ShowCharacter();
    return Py_SIZE(a);
}

果不其然,编译以后,打开python,命令行中会输出很多begin,然后直接退出,就是ShowCharacter()的问题了,目前还不太清楚问题具体出在哪,但是至少知道了一件事,当我们运行python时,它的内部会执行string_length()函数,我猜测在执行期间,运行到ShowCharacter()函数,这个函数内容会调用一些还未初始化的变量/类型,导致程序出错。
在这里插入图片描述
最后,为了实现这个功能,我先尝试了修改函数参数,加入一个flag参数,默认值为false,然后如果flag为true时,这个函数执行ShowCharacter(),但不幸的时,加入这个参数,系统会编译的时候报错,可能是其他用到这个string_length函数的地方不兼容,于是,我便尝试让ShowCharacter()在满足某些条件的情况下,才执行,最终,调整参数,实现了这个结果,代码如下:

static Py_ssize_t
string_length(PyStringObject *a)
{
	// -----------------------
	if (a->ob_size >= 500)
	{
		ShowCharacter();
	}
	// -----------------------
    return Py_SIZE(a);
}

这样一来,我们可以设定一个长度大于500的字符串s,调用len(s)来间接查看字符缓冲区的引用变化。最终结果如下:
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值