GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — gh-158445: Reject invalid UCS4 in PyUnicode_FromKindAndData() by vstinner · Pull Request #158447 · python/cpython

Conversation

@vstinner

@vstinner vstinner commented Sep 29, 2026 •
edited by bedevere-app Bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND) and PyUnicodeWriter_WriteUCS4() now raise an exception if a character is not in the [U+0000; U+10ffff] range, instead of creating an invalid str object.

  • Add _testinternalcapi._Py_MAX_UNICODE.
  • Add unicode_invalid_character() helper function.
  • Issue: C API: Detect invalid UCS4 characters in debug mode #158445

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@vstinner
pythongh-158445: Reject invalid UCS4 in PyUnicode_FromKindAndData()
da5cb33
PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND) and
PyUnicodeWriter_WriteUCS4() now raise an exception if a character is
not in the [U+0000; U+10ffff] range, instead of creating an invalid
str object.

* Add _testinternalcapi._Py_MAX_UNICODE.
* Add unicode_invalid_character() helper function.
@vstinner
vstinner requested a review from ZeroIntensity as a code owner September 29, 2026 18:27
@bedevere-app bedevere-app Bot mentioned this pull request Sep 29, 2026
C API: Detect invalid UCS4 characters in debug mode #158445
Closed
@bedevere-app bedevere-app Bot added the awaiting core review label Sep 29, 2026
@read-the-docs-community

read-the-docs-community Bot commented Sep 29, 2026

Copy link
Copy Markdown

Documentation build overview

📚 cpython-previews | 🛠️ Build #34835623 | 📁 Comparing da5cb33 against main (115c297)

  🔍 Preview build  

2 files changed
± c-api/unicode.html
± whatsnew/changelog.html
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Sep 30, 2026

Copy link
Copy Markdown
Member Author

@serhiy-storchaka: Would you mind to review this change? See the issue for the rationale.

The change makes the two functions a little bit slower, but also makes them safer. It should not be possible to create an invalid string in Python.

In the wild, I mostly saw invalid characters when debugging CPython. For example, PyUnicode_New(size, 0x10ffff) creates a UCS-4 buffer filled with the byte pattern 0xff which creates invalid characters \Uffffffff on purpose: to detect usage of uninitialized characters.

The other case where I saw invalid characters was on Solaris with wchar_t* strings (Py_UCS4 strings in practice). The _Py_DecodeNonUnicodeWchar() function was added to fix these characters.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@serhiy-storchaka

serhiy-storchaka commented Sep 30, 2026

Copy link
Copy Markdown
Member

No, I do not think it is worth to slow down this function. If you need an additional check -- use the UTF32 decoder.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Sep 30, 2026

Copy link
Copy Markdown
Member Author

@serhiy-storchaka:

No, I do not think it is worth to slow down this function. If you need an additional check -- use the UTF32 decoder.

It's a little bit surprising that only 2 functions of the C API ignores invalid characters. But you have a point with performance.

I wrote PR gh-158502 to document the undefined behavior, only detect invalid characters in debug mode (raise SystemError), and add tests on the behavior in release and debug mode.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Sep 30, 2026

Copy link
Copy Markdown
Member Author

Rejected in favor of #158502.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner vstinner closed this Sep 30, 2026
@vstinner
vstinner deleted the from_ucs4 branch September 30, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@ZeroIntensity ZeroIntensity Awaiting requested review from ZeroIntensity ZeroIntensity is a code owner

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

awaiting core review

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@vstinner @serhiy-storchaka
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.