Message412386
Maybe related to https://bugs.python.org/issue8420
Somewhat obscure, but using only standard Python, and no frame- or gc-hacks, it looks like we can get a use-after-free:
from random import random
BADNESS = 0.0
class Bad:
def __eq__(self, other):
if random() < BADNESS:
set1.clear()
if random() < BADNESS:
set2.clear()
return True
def __hash__(self):
return 42
SIZE = 100
TRIALS = 10_000
ops = [
"|", "|=",
"==", "!=",
"<", "<=",
">", ">=",
# "&", # crash!
# "&=", # crash!
"^",
# "^=", # crash
# "-", # crash
"-=",
]
for op in ops:
stmt = f"set1 {op} set2"
print(stmt, "...")
for _ in range(TRIALS):
BADNESS = 0.00
set1 = {Bad() for _ in range(SIZE)}
set2 = {Bad() for _ in range(SIZE)}
BADNESS = 0.02
exec(stmt)
print("ok.") |
|
Date |
User |
Action |
Args |
2022-02-02 18:01:22 | Dennis Sweeney | set | recipients:
+ Dennis Sweeney, rhettinger |
2022-02-02 18:01:22 | Dennis Sweeney | set | messageid: <1643824882.75.0.278611227582.issue46615@roundup.psfhosted.org> |
2022-02-02 18:01:22 | Dennis Sweeney | link | issue46615 messages |
2022-02-02 18:01:22 | Dennis Sweeney | create | |
|