පයිතන්
ජාවා පිළිතුරෙන් ආශ්වාදයක්:
>>> patch = '\x312\x2D7'
>>> import ctypes;ctypes.c_int8.from_address(id(len(patch))+8).value=eval(patch)
>>> 2 + 2
5
ජාවා මෙන්ම, CPython ද පළමු කුඩා සංඛ්යා කිහිපයේ ඕනෑම පිටපතක් සඳහා එකම මතක ස්ථානයක් භාවිතා කරයි (මතකය සේවය කරන්නේ නම් 0-255). මෙය ඇතුළට ගොස් එම මතක ස්ථානය හරහා කෙලින්ම සංස්කරණය කරයි ctypes
. patch
යනු අපැහැදිලි "12-7"
, len
4 ක් සහිත නූලක් වන අතර එය eval
5 දක්වා වේ.
වඩාත් අපැහැදිලි අනුවාදයකි
exec("\x66\x72\x6f\x6d\x20c\x74\x79\x70e\x73\x20\x69\x6d\x70\
\x6f\x72\x74\x20c\x5f\x69\x6e\x748\x20a\x73\x20x\x3bf\x72\x6f\
\x6d\x20\x73\x74\x72\x75c\x74\x20\x69\x6d\x70\x6f\x72\x74\x20\
ca\x6cc\x73\x69\x7ae\x20a\x73\x20x0\x3bx\x2ef\x72\x6f\x6d\x5f\
a\x64\x64\x72e\x73\x73\x28\x69\x64\x284\x29\x2bx0\x28\x27\x50\
\x50\x27\x29\x29\x2e\x76a\x6c\x75e\x3d5")
2 + 2 න් ඔබ්බට
OP සඳහන් කළ පරිදි, 2 + 2 තරමක් කම්මැලි විය හැකිය; එබැවින් අපයෝජනය සඳහා පිරිසිදු, බහුකාර්ය, බහු පළල කේත කිහිපයක් මෙන්න.
from __future__ import division, print_function
import struct
import ctypes
import random
# Py 2.7 PyIntObject:
# - PyObject_HEAD
# - PyObject_HEAD_EXTRA [usually nothing unless compiled with DEBUG]
# - (Py_ssize_t) ob_refcnt
# - (_typeobject) *ob_type
# - (long) ob_ival
# two platform-sized (32/64-bit) ints (ob_refcnt and *ob_type from above)
offset = struct.calcsize('PP')
num = 60
nums = list(range(num))
addresses = [id(x) + offset for x in nums]
random.shuffle(nums)
for a, n in zip(addresses, nums):
ctypes.c_ssize_t.from_address(a).value = n
print('2 + 2 =', 2+2)
print('9 - 4 =', 9-4)
print('5 * 6 =', 5*6)
print('1 / 0 =\n', 1/0)
print('(1 + 2) + 3 = ', (1+2)+3)
print('1 + (2 + 3) = ', 1+(2+3))
print('(2 + 3) + 1 = ', (2+3)+1)
print('2 + (3 + 1) = ', 2+(3+1))
පයිතන් 2.7 සමඟ ධාවනය කිරීම ... අවසානයේ එම රේඛාව නොසලකා හරින්න. මට පහසුවෙන් ප්රවේශ විය හැකි පද්ධති දෙක වන වින්ඩෝස් 64-බිට් සහ උබුන්ටු 32-බිට් වල ක්රියා කරයි.
$ python awful.py
2 + 2 = 24
9 - 4 = 49
5 * 6 = 55
1 / 0 = 0.76
(1 + 2) + 3 = 50
1 + (2 + 3) = 68
(2 + 3) + 1 = 50
2 + (3 + 1) = 61
Segmentation fault (core dumped)
ද බහුල වීම විස්මයට අපි කොහෙද (එකතු කිරීමේ associative දේපල, බිඳ දැමිය හැක්කේ, එය + ආ ) + ඇ = වන , + ( ආ + ඇ 1 හා 2 වන දුටු ලෙස,) 1+2+3
මාර්ග, නමුත් ගෙස්ටාපෝ අපි ද න්යාදේශ දේපල (එහිදී බිඳ ඇති + ආ = b + a ; 2 වන සහ 3 වන පේළි). පයිතන් පරිවර්තකයා එකතු කිරීමේ ප්රකාශන වටා ඇති අතිරික්ත වරහන් නොසලකා හරිනු ඇත්දැයි මම කල්පනා කරමි.