python / python/cpython

OrderedDict.pop() can segfault when key equality changes between lookups

Ouverte
#154,817 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

interpreter-core type-crash
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Crash report

What happened?

Calling collections.OrderedDict.pop() without a default value can cause a segmentation fault if the lookup key has a stateful __eq__ implementation that returns different results across successive comparisons.

The crash occurs on the current main branch.

Minimal reproducer:

from collections import OrderedDict

class K:
    def __init__(self):
        self.calls = 0

    def __hash__(self):
        return 12345

    def __eq__(self, other):
        self.calls += 1
        return self.calls == 1

k1 = K()
k2 = K()

od = OrderedDict()
od[k1] = "value"

od.pop(k2)

Running this with a locally built CPython from main results in:

Segmentation fault (core dumped)

Expected behavior:

  • OrderedDict.pop() should not crash the interpreter.
  • It should either remove the matching item or raise KeyError if the key is not found.
CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

Python 3.16.0a0 (heads/fix-odict-pop-null-failobj:2ffab083782, Jul 28 2026, 12:31:11) [GCC 13.3.0]

Linked PRs
  • gh-154818

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le point d’entrée OrderedDict.pop() et exécutez le reproducer minimal sur une branche main de CPython construite localement. C’est terminé lorsque le reproducer ne provoque plus de segmentation fault et que pop() supprime soit l’élément correspondant, soit lève KeyError lorsqu’aucune clé n’est trouvée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.