Skip to content
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

Use "unsigned char:1" for flags #17

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

pengi
Copy link

@pengi pengi commented Feb 14, 2023

"char" is treated, at least in many cases, as signed values. Having that field as 1 bit means it can be treated as one sign bit, no data bits. Thus only values 0 and -1 will be accepted

It seems to differ between versions of the compiler. But in any case, explicitly defining it as unsigned means only the values 0 and 1 will be accepted, and therefore there shouldn't be any issues between compiler versions.

This is a fix for an issue I had using:

gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

Was compiling with flags:

gcc -g -O3 -Wdouble-promotion -Wall -Werror -Wpedantic

And the errors I got was:

src/vendor/tinyprintf/tinyprintf.c: In function ‘tfp_format’:
src/vendor/tinyprintf/tinyprintf.c:282:36: error: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘1’ to ‘-1’ [-Werror=overflow]
  282 |                     p.align_left = 1;
      |                                    ^
src/vendor/tinyprintf/tinyprintf.c:285:28: error: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘1’ to ‘-1’ [-Werror=overflow]
  285 |                     p.lz = 1;
      |                            ^
src/vendor/tinyprintf/tinyprintf.c:288:29: error: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘1’ to ‘-1’ [-Werror=overflow]
  288 |                     p.alt = 1;
      |                             ^
src/vendor/tinyprintf/tinyprintf.c:305:22: error: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘1’ to ‘-1’ [-Werror=overflow]
  305 |               p.lz = 1;  /* zero-padding */
      |                      ^
src/vendor/tinyprintf/tinyprintf.c:374:25: error: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘1’ to ‘-1’ [-Werror=overflow]
  374 |                 p.alt = 1;
      |                         ^

This patch should solve it.

I've been trying to also add the corresponding warning to the make file, but can't seem to reproduce it in tinyprintfs build environment.

"char" is treated, at least in many cases, as signed values. Having
that field as 1 bit means it can be treated as one sign bit, no
data bits. Thus only values 0 and -1 will be accepted

It seems to differ between versions of the compiler. But in any
case, explicitly defining it as unsigned means only the values 0
and 1 will be accepted, and therefore there shouldn't be any issues
between compiler versions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant