Assignment of a signed value 'str' to a bigger unsigned variable 'ucs4' at /Objects/unicodeobject.c
Mantenedores costumam responder em até 1 dia
@divya-git03 já está trabalhando nisso.
Desde 5/11/2026.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 78/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Domínio
- backend, operating-systems
Direção de pesquisa
Leia o ramo PyUnicode_4BYTE_KIND em Objects/unicodeobject.c e verifique como _PyUnicodeWriter_WriteLatin1String trata bytes acima de 0x7F. Confirme a extensão de sinal com um teste direcionado que use um buffer Unicode de quatro bytes e um byte Latin-1, como 0xE9. O trabalho estará concluído quando o ponto de código resultante permanecer dentro do intervalo Unicode e os testes relevantes passarem.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Bug report
Potential Problem
In /Objects/unicodeobject.c in the PyUnicode_4BYTE_KIND branch https://github.com/python/cpython/blob/3.12/Objects/unicodeobject.c#L1922. A static analyzer has identified a genuine issue: *str is of type char (which is signed on x86/x64 architectures). Consequently, when Latin-1 bytes in the range 0x80–0xFF are cast to Py_UCS4, they undergo sign extension—for example, 0xE9 becomes 0xFFFFFFE9. This value exceeds MAX_UNICODE and violates the invariants of the str object. This code path can be triggered via the exported function _PyUnicodeWriter_WriteLatin1String when using a PyUnicode_4BYTE_KIND buffer (while not invoked internally by CPython itself, the issue can manifest in extensions). The fix is to introduce an intermediate cast to Py_UCS1
case PyUnicode_4BYTE_KIND: {
Py_UCS4 *start = (Py_UCS4 *)data + index;
Py_UCS4 *ucs4 = start;
for (; str < end; ++ucs4, ++str)
*ucs4 = (Py_UCS4)*str;
assert((ucs4 - start) <= PyUnicode_GET_LENGTH(unicode));
break;
}
default:
Py_UNREACHABLE();
}
}
Possible Solution
Add an intermediate cast to Py_UCS1:
*ucs4 = (Py_UCS4)(Py_UCS1)*str;
Found by Linux Verification Center (portal.linuxtesting.ru (https://portal.linuxtesting.ru/)) with SVACE.
Author D. Babushkin.
CPython versions tested on:
3.12
Operating systems tested on:
No response
- Linguagem predominante
- Python
- Estrelas
- 77.9k
- Forks
- 37.1k
- Merge médio
- 17h 19min
- PRs com merge (30d)
- 679
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python/cpython
-
build OS-unsupported OS-windows type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 60/100
Mantenedores costumam responder em até 1 dia
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Talvez já em andamento @TheLouisMahdi assumiu há 4 dias. Abertadocs
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 82/100
python/cpython#161078 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
OS-windows type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
-
docs
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
python/cpython#161007 · 4 comentários ·
Mantenedores costumam responder em até 1 dia
-
tests topic-profiling type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
python/cpython#160881 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
Todas as issues de python/cpython
Issues semelhantes
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
aws-samples/sample-per-model-bedrock#782 ·
Mantenedores costumam responder em até 1 dia
-
Google text documents are base64-encoded twiceTalvez já em andamento @feiiiiii5 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
coveragepy/coveragepy#2364 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 72/100