CPython, C requirements, and IEEE 754

CPython, C requirements, and IEEE 754

Welcome to LWN.receive

The next subscription-entirely deliver has been made available to you
by an LWN subscriber. Hundreds of subscribers rely upon LWN for the
finest news from the Linux and free instrument communities. Whenever you happen to revel in this
article, please engage into consideration subscribing to LWN. Thanks
for visiting LWN.receive!

By Jake Edge
March 2, 2022

Per chance February became “compiler modernization” month. The Linux kernel
not too lengthy within the past made up our minds to crawl to the C11 traditional
for its code; Python has honest undergone a same route of for
determining which model of C to make employ of for building its
CPython reference implementation. A calculation within the CPython interpreter
went awry when built with a pre-launch version of the upcoming GCC 12; that
regression led down a path that ended up with the adoption of C11 for CPython as smartly.

A malicious program that became mounted in
early February started the ball rolling for Python. Victor Stinner
encountered a GCC
that induced CPython to not receive the anticipated IEEE 754 floating-point
NaN (not a quantity) trace in a calculation. An LWN article sheds some light on NaNs (and how
they’re broken-down in Python) if you happen to desire a chunk more background.
The calculation became the usage of the
HUGE_VAL fixed, which is defined as an ISO C fixed with a
trace of certain infinity; the code save of abode the cost of the interior
Py_NAN fixed broken-down by the interpreter to
HUGE_VAL*0, which might perhaps well well well additionally neutral silent, certainly, overview to a NaN. Multiplying
infinity by any quantity is defined to be a NaN for IEEE 754.

Throughout his investigation of the pronounce of affairs, Stinner chanced on that in save of abode of the
calculation, Python might perhaps well well perhaps merely employ the NAN fixed defined in
—as lengthy as a C99 version of the header file
became broken-down.
As half of the malicious program dialogue, Petr Viktorin stated that PEP 7
(“Vogue Info for C Code“) has to be updated to concentrate on the
need for the C99 header file. So Stinner duly created a pull seek facts from for a
switch to the PEP, however Guido van Rossum stated
that a switch of that nature has to be discussed on the python-dev mailing record.

That led Stinner to post
a message to keep up a correspondence about the switch on February 7. As it appears, there are finally two
bugs mounted by Stinner that require parts of the C99 math API; malicious program 45440 reported a
pronounce of affairs with the CPython Py_IS_INFINITY() macro; the repair for that also eager
the usage of the C99 . As Stinner noteworthy, C99 is
now 23 years vulnerable, and improve for it in compilers is frequent; GCC,
Clang, and Microsoft Visible C (MSVC) all improve the wanted functions.

Floating point

Stamp Dickinson pointed
that the existence of the NAN fixed is just not required by
C99 straight; it is entirely reward if IEEE 754 floating
point is enabled as smartly. He belief that it made sense for CPython to
require IEEE 754, however wondered whether Python, the language,
might perhaps well well well additionally neutral silent also require it. Stinner stated
that each one stylish computer systems improve IEEE 754; even embedded devices
without a floating-point unit (FPU) usually improve it in
instrument. “For the time being, launch air museums, or not it’s laborious to make a selection up computer systems
which fabricate not
implement IEEE 754.

Stinner became in prefer of requiring IEEE 754 for CPython; Gregory P. Smith agreed.
Brett Cannon wondered
if there became even any skill to examine with systems that lacked the improve:

Halt we now own a buildbot that has a CPU or OS that can not take care of IEEE-754? What
are the potentialities we are in a position to receive one? If the solutions are “none” and “slim”, then
it appears cheap to require NaN and IEEE-754.

Stinner reported
that each one among the buildbot machines supported IEEE 754, so the tear became certain to
require it. In the case of the Python language, Christopher Barker stated
that IEEE 754 improve might perhaps well well well additionally neutral silent not be required for all implementations
of Python, however that
it has to be instructed. Steve
Dower agreed
that leaving it up to Python implementations made sense: “Otherwise,
we would prevent _by specification_ the usage of Python as a
scripting language for issues where floats might perhaps well well well additionally neutral not even be
” He stated that making it a requirement would inhibit
adoption: “The more ‘or not it’s-entirely-Python-if-it-has-X’
restrictions we now own, the less sharp we change into.

Which C?

Switching to C99 is radiant if the compilers being broken-down to possess CPython
improve it, Cannon stated.
Viktorin requested
about MSVC’s improve for all of C99; he did not pick up any documentation saying that
it did, so it will probably probably well additionally be greater to own interplay into consideration C11,
which is
supported. “Halt we desire to enhance a subset bask in ‘C99 except the
functions that had been
eliminated in C11’?
” Dower, who works on Python at Microsoft, stated
that he had not chanced on an reply to the C99 quiz either:

The overall C99 library is supposedly supported, however there are (immense?) gaps in
the compiler improve. Presumably these are functions that had been eliminated in C11?
I fabricate not know what’s on that record.

[…] In my belief, I peek no motive to “require” C99 as a whole. We now own a vogue
facts already, and can record the additional compiler functions that we allow
alongside with guidance on updating reward code and making certain compatibility.

I fabricate not peek great likelihood requiring the C99 traditional library, though. It be the
compiler functions that appear to own less protection.

Stinner urged
tying the wording to what became supported in MSVC, however H. Vetinari belief
a wiser formula might perhaps well well well additionally be “‘C99 without the issues that turned
non-mandatory in C11’, or perhaps
‘C11 without non-mandatory functions’
“. That led Viktorin to shock
why C11 wouldn’t construct a wiser target: “[…] the first thing keeping
us from C99 is MSVC improve, and
since that compiler it sounds as if skipped C99, might perhaps well well well additionally neutral silent we skip it as smartly?

Cannon stated
that he chanced on a record
of non-mandatory C11 functions
, none of which had been finally wanted; if the “C11
without non-mandatory functions”
model is widely supported, because it will probably probably well well seem
that it is, “I receive that is a composed target to own“.
Meanwhile, both Inada
and Viktorin
had been occupied with the usage of C11’s anonymous
feature in CPython.

Viktorin also stated that in grunt to preserve the CPython public header files
compatible with C++, anonymous unions might perhaps well well perhaps not be broken-down in them, though
Inada stated
that C++ does
improve them
, “with some cheap limitations“. While
CPython targets to be compatible with C++ on the API diploma, it is laborious to
completely specify what which system—or even which version of the C traditional
is supported—as Smith pointed

We’re likely overspecifying in any doc we procedure about what we require
since the entirely definition any of us are finally in a position to constructing for
what we require is “does it bring on the side of this compiler on this platform? If
certain, then we appear to
improve it. will we state that? entirely with buildbots or varied CI
[continuous integration]” – We’re
usually not versed particularly language requirements (with the exception of compiler
folks, who is?), and compilers fabricate not comply strictly with the final shapes of
these finally for either
practical or hysterical causes. So it’s not well-known what we claim to aspire to,
reality is progressively murkier. A doc about requirements is primarily
helpful to give guidance to what we request to be aligned with and what’s or
is just not allowed to be broken-down in
new code. Our code itself progressively has the final grunt.

The became a slightly
diminutive patch
to PEP 7 to affirm that CPython 3.11 and past employ
C11 without the non-mandatory functions (and that the general public C API has to be
compatible with C++). As smartly as, malicious program 46656 and a
February 25 post
from Stinner doc the changes to the floating-point requirements; curiously, they
enact not mention IEEE 754, honest a requirement for a floating-point NaN. While it
might perhaps well well well additionally neutral own seemed bask in a chunk of a yak-shaving remark alongside the come, the GCC
regression at closing ended in a wiser belief of which model of C is
supported for building CPython—alongside with involving to a model from this
century. All in all, a great “days” work.

(Log in to post feedback)

Read More



β€œSimplicity, patience, compassion.
These three are your greatest treasures.
Simple in actions and thoughts, you return to the source of being.
Patient with both friends and enemies,
you accord with the way things are.
Compassionate toward yourself,
you reconcile all beings in the world.”
― Lao Tzu, Tao Te Ching

you're currently offline