版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/yueguanghaidao/article/details/35644165

    今天在伯乐在线上看到一篇比較有意思的文章:趣味挑战:写一个 2 + 2 = 5 的程序 ,python版代码例如以下:

patch = '\x312\x2D7'
import ctypes;ctypes.c_int8.from_address(id(len(patch))+8).value=eval(patch)

这方法真赞,充分利用了python的小整数缓存方案。
我第一眼看patch,这是啥玩意。

len(patch)是4,将id(4)+8的地址值改动为12-7,所以2+2=5,很完美。

假设要想全然了解这里面的魔法,须要对Python的整数对象有所了解,

#define PyObject_HEAD           \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type; typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;

假设没定义Py_TRACE_REFS,那么_PyObject_HEAD_EXTRA为空。所以python的整数对象有12字节(对32位来说),而值明显就是在第8个字节。我们也能够通过该方法获取引用计数。

至于为什么sys.getrefcount引用多1,能够看曾经Python垃圾回收机制及gc模块具体解释一文。

那有没有其他方案呢?

   1.memmove ,须要注意的就是第一个參数是目标地址

      

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

    2.既然memmove能够,那试试memset,注意最后那个size为1。自己想想为什么?

       

    3.其他的方法就交给聪明的你吧,ctypes是一个宝库,须要好好挖掘。

最新文章

  1. Windows Phone 十九、罗盘
  2. Owin SelfHost Asp.net WebApi 遇到 No type was found that matches the controller named 'ControllerName' 异常的解决方案
  3. linux下的device tree
  4. sql server中的decimal或者numeric的精度问题
  5. java中的定时器
  6. CruiseControl.NET : Configuration Preprocessor
  7. 强化一下开源库:Synopse
  8. leetcode - Pascal's Triangle
  9. 在windows server2003下安装Redmine
  10. CloudFormation
  11. ASP.NET Web API 2.0新特性:Attribute Routing1
  12. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
  13. 怎样写一个与Windows10 IE11兼容的标准BHO?
  14. noi.openjuge 2.6.90
  15. spring源码:Aware接口
  16. vimrc 的配置
  17. Java TreeSet的定制排序
  18. Python3中 sys.argv的用法
  19. Linux内核设计第八周学习总结 理解进程调度时机跟踪分析进程调度与进程切换的过程
  20. Reflow(回流)和Repaint(重绘) (转)

热门文章

  1. 利用jquery.backstretch插件,背景切换
  2. 主打安全 阿里巴巴联合公安部打造PMOS
  3. Struts初始
  4. Java学习--javabean
  5. 关于Java中语句符号及格式的理解
  6. 基于token的后台身份验证(转载)
  7. 关于session销毁的问题,invalidate() 和removeAttribute()
  8. Android Dialog的整个生命周期
  9. Hive常用配置
  10. Automate the Sizing of your SGA in Oracle 10g