Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34.1k
Closed
Description
Crash report
What happened?
Thebytearray object is not free-thread safe. Below is a script which will elicit free-thread associated errors (segfault and incorrect values) from the variousbytearray methods:
importthreadingdefclear(b,a,*args):# MODIFIES!b.wait()try:a.clear()exceptBufferError:passdefclear2(b,a,c):# MODIFIES c!b.wait()try:c.clear()exceptBufferError:passdefpop1(b,a):# MODIFIES!b.wait()try:a.pop()exceptIndexError:passdefappend1(b,a):# MODIFIES!b.wait()a.append(0)definsert1(b,a):# MODIFIES!b.wait()a.insert(0,0)defextend(b,a):# MODIFIES!c=bytearray(b'0'*0x400000)b.wait()a.extend(c)defremove(b,a):# MODIFIES!c=ord('0')b.wait()try:a.remove(c)exceptValueError:passdefreverse(b,a):# modifies inplaceb.wait()a.reverse()defreduce(b,a):b.wait()a.__reduce__()defreduceex2(b,a):b.wait()a.__reduce_ex__(2)defreduceex3(b,a):b.wait()c=a.__reduce_ex__(3)# print(c)assertnotc[1]orb'\xdd'notinc[1][0]defcount0(b,a):b.wait()a.count(0)defdecode(b,a):b.wait()a.decode()deffind(b,a):c=bytearray(b'0'*0x40000)b.wait()a.find(c)defhex(b,a):b.wait()a.hex('_')defjoin(b,a):b.wait()a.join([b'1',b'2',b'3'])defreplace(b,a):b.wait()a.replace(b'0',b'')defmaketrans(b,a,c):b.wait()try:a.maketrans(a,c)exceptValueError:passdeftranslate(b,a,c):b.wait()a.translate(c)defcopy(b,a):b.wait()c=a.copy()ifc:assertc[0]==48# '0'defendswith(b,a):b.wait()assertnota.endswith(b'\xdd')defindex(b,a):b.wait()try:a.index(0xdd)exceptValueError:returnassertFalsedeflstrip(b,a):b.wait()assertnota.lstrip(b'0')defpartition(b,a):b.wait()assertnota.partition(b'\xdd')[2]defremoveprefix(b,a):b.wait()assertnota.removeprefix(b'0')defremovesuffix(b,a):b.wait()assertnota.removesuffix(b'0')defrfind(b,a):b.wait()asserta.rfind(b'\xdd')==-1defrindex(b,a):b.wait()try:a.rindex(b'\xdd')exceptValueError:returnassertFalsedefrpartition(b,a):b.wait()assertnota.rpartition(b'\xdd')[0]defrsplit(b,a):b.wait()assertlen(a.rsplit(b'\xdd'))==1defrstrip(b,a):b.wait()assertnota.rstrip(b'0')defsplit(b,a):b.wait()assertlen(a.split(b'\xdd'))==1defsplitlines(b,a):b.wait()l=len(a.splitlines())assertl>1orl==0defstartswith(b,a):b.wait()assertnota.startswith(b'\xdd')defstrip(b,a):b.wait()assertnota.strip(b'0')defrepeat(b,a):b.wait()a*2defcontains(b,a):b.wait()assert0xddnotinadeficoncat(b,a):# MODIFIES!c=bytearray(b'0'*0x400000)b.wait()a+=cdefirepeat(b,a):# MODIFIES!b.wait()a*=2defsubscript(b,a):b.wait()try:asserta[0]!=0xddexceptIndexError:passdefass_subscript(b,a):# MODIFIES!c=bytearray(b'0'*0x400000)b.wait()a[:]=cdefmod(b,a):c=tuple(range(4096))b.wait()try:a%cexceptTypeError:passdefrepr_(b,a):b.wait()repr(a)defcapitalize(b,a):b.wait()c=a.capitalize()assertnotcorc[0]notin (0xdd,0xcd)defcenter(b,a):b.wait()c=a.center(0x60000)assertnotcorc[0x20000]notin (0xdd,0xcd)defexpandtabs(b,a):b.wait()c=a.expandtabs()assertnotcorc[0]notin (0xdd,0xcd)defljust(b,a):b.wait()c=a.ljust(0x600000)assertnotcorc[0]notin (0xdd,0xcd)deflower(b,a):b.wait()c=a.lower()assertnotcorc[0]notin (0xdd,0xcd)defrjust(b,a):b.wait()c=a.rjust(0x600000)assertnotcorc[-1]notin (0xdd,0xcd)defswapcase(b,a):b.wait()c=a.swapcase()assertnotcorc[-1]notin (0xdd,0xcd)deftitle(b,a):b.wait()c=a.title()assertnotcorc[-1]notin (0xdd,0xcd)defupper(b,a):b.wait()c=a.upper()assertnotcorc[-1]notin (0xdd,0xcd)defzfill(b,a):b.wait()c=a.zfill(0x400000)assertnotcorc[-1]notin (0xdd,0xcd)defiter_next(b,a,it):b.wait()list(it)defiter_reduce(b,a,it):b.wait()c=it.__reduce__()assertnotc[1]orb'\xdd'notinc[1][0]defcheck(funcs,a=None,*args):ifaisNone:a=bytearray(b'0'*0x400000)barrier=threading.Barrier(len(funcs))thrds= []forfuncinfuncs:thrd=threading.Thread(target=func,args=(barrier,a,*args))thrds.append(thrd)thrd.start()forthrdinthrds:thrd.join()if__name__=="__main__":whileTrue:# hard errorscheck([clear]+ [reduce]*10)check([clear]+ [reduceex2]*10)check([clear]+ [append1]*10)check([clear]*10)check([clear]+ [count0]*10)check([clear]+ [decode]*10)check([clear]+ [extend]*10)check([clear]+ [find]*10)check([clear]+ [hex]*10)check([clear]+ [insert1]*10)check([clear]+ [join]*10)check([clear]+ [pop1]*10)check([clear]+ [remove]*10)check([clear]+ [replace]*10)check([clear]+ [reverse]*10)check([clear,clear2]+ [maketrans]*10,bytearray(range(128)),bytearray(range(128)))check([clear]+ [translate]*10,None,bytearray.maketrans(bytearray(range(128)),bytearray(range(128))))check([clear]+ [repeat]*10)check([clear]+ [iconcat]*10)check([clear]+ [irepeat]*10)check([clear]+ [ass_subscript]*10)check([clear]+ [repr_]*10)check([clear]+ [iter_next]*10,b:=bytearray(b'0'*0x400),iter(b))# value errorscheck([clear]+ [reduceex3]*10,bytearray(b'a'*0x40000))check([clear]+ [copy]*10)check([clear]+ [endswith]*10)check([clear]+ [index]*10)check([clear]+ [lstrip]*10)check([clear]+ [partition]*10)check([clear]+ [removeprefix]*10,bytearray(b'0'))check([clear]+ [removesuffix]*10,bytearray(b'0'))check([clear]+ [rfind]*10)check([clear]+ [rindex]*10)check([clear]+ [rpartition]*10)check([clear]+ [rsplit]*10,bytearray(b'0'*0x4000))check([clear]+ [rstrip]*10)check([clear]+ [split]*10,bytearray(b'0'*0x4000))check([clear]+ [splitlines]*10,bytearray(b'\n'*0x400))check([clear]+ [startswith]*10)check([clear]+ [strip]*10)check([clear]+ [contains]*10)check([clear]+ [subscript]*10)check([clear]+ [mod]*10,bytearray(b'%d'*4096))check([clear]+ [capitalize]*10,bytearray(b'a'*0x40000))check([clear]+ [center]*10,bytearray(b'a'*0x40000))check([clear]+ [expandtabs]*10,bytearray(b'0\t'*4096))check([clear]+ [ljust]*10,bytearray(b'0'*0x400000))check([clear]+ [lower]*10,bytearray(b'A'*0x400000))check([clear]+ [rjust]*10,bytearray(b'0'*0x400000))check([clear]+ [swapcase]*10,bytearray(b'aA'*0x200000))check([clear]+ [title]*10,bytearray(b'aA'*0x200000))check([clear]+ [upper]*10,bytearray(b'a'*0x400000))check([clear]+ [zfill]*10,bytearray(b'1'*0x200000))check([clear]+ [iter_reduce]*10,b:=bytearray(b'0'*0x400),iter(b))# Not tested:# getitem (masked by subscript), setitem (masked by ass_subscript)# str (just calls repr), iter_setstate and iter_length_hint (can't really fail)
CPython versions tested on:
3.14
Operating systems tested on:
Linux
Output from running 'python -VV' on the command line:
Python 3.14.0a4+ experimental free-threading build (heads/main:f3980af38b, Jan 20 2025, 18:31:15) [GCC 11.4.0]