Skip to content

fix printf negative infinity #15965

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from

Conversation

divinity76
Copy link
Contributor

@divinity76 divinity76 commented Sep 20, 2024

sprintf("%.17g", -INF); should return -INF not INF

resolves #15964

I tried fixing it inside php_sprintf_appendstring as it seems the original author intended, but.. that was difficult, and I broke other stuff.

(I think php_sprintf_appendstring would benefit from using smart_str https://www.phpinternalsbook.com/php7/internal_types/strings/smart_str.html , but idk how much effort that would be)

@cmb69
Copy link
Member

cmb69 commented Sep 20, 2024

Note that here is some overlap with #10298 (and that likely neither solution solves #9209).

@divinity76
Copy link
Contributor Author

Oh I was unaware.

Close this PR then? this is a low-effort fix~

Copy link
Member

@cmb69 cmb69 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my opinion, this is a better approach than #10298, since it is way less intrusive.

// ideally negative should have been handled inside php_sprintf_appendstring ,
// but the code is difficult to debug, and it's easy to break stuff inside there (I tried, I broke stuff),
// handling it here is much easier..
php_sprintf_appendstring(buffer, pos, "-INF", 4, 0, padding,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hard-coding the min_width argument (4) here, looks wrong to me (I am aware that this already had been done this way before); see https://3v4l.org/WtHcq. Why not simply pass width instead? Same for the NaN and the -INF cases.

Copy link
Member

@cmb69 cmb69 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! This looks good to me, but maybe adding some more test cases makes sense; escpecially giving a width in the format specifier to show the alignment, and maybe some more, e.g. using 0 padding.

And I would also change the max_width for NaN, but that can be done in a follow-up PR, too.

Anyhow, since we're late in the PHP 8.4.0 pre-release cycle, this requires approval from the @php/release-managers-84.

Copy link
Member

@NattyNarwhal NattyNarwhal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense as a bugfix

@cmb69 cmb69 closed this in c2d3734 Dec 2, 2024
@cmb69
Copy link
Member

cmb69 commented Dec 2, 2024

This fix has fallen through the cracks.

I've now applied to PHP-8.4 and merged up.

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

printf() can strip sign of -INF
3 participants