Re: [PATCH BlueZ] core/device: Fix build on some platforms

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jakub,

On Mon, Oct 19, 2015, Jakub Pawlowski wrote:
> On Mon, Oct 19, 2015 at 10:35 PM, Johan Hedberg <johan.hedberg@xxxxxxxxx> wrote:
> > Hi Jakub,
> >
> > On Mon, Oct 19, 2015, Jakub Pawlowski wrote:
> >> due to type promotions in C this code was failing on some platforms.
> >>
> >> src/device.c:2016:8: error: format specifies type 'unsigned short' but the
> >>       argument has type 'uint8_t' (aka 'unsigned char') [-Werror,-Wformat]
> >>   properties, uuid_str);
> >>   ^~~~~~~~~~
> >> /build/falco/usr/include/bits/stdio2.h:39:7: note: expanded from macro 'sprintf'
> >>                            __VA_ARGS__)
> >>                            ^
> >> ---
> >>  src/device.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/src/device.c b/src/device.c
> >> index 0d3a655..b4e6d53 100644
> >> --- a/src/device.c
> >> +++ b/src/device.c
> >> @@ -2015,7 +2015,7 @@ static void store_chrc(struct gatt_db_attribute *attr, void *user_data)
> >>
> >>       sprintf(handle, "%04hx", handle_num);
> >>       bt_uuid_to_string(&uuid, uuid_str, sizeof(uuid_str));
> >> -     sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hx:%s", value_handle,
> >> +     sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02x:%s", value_handle,
> >>                                                       properties, uuid_str);
> >
> > Wouldn't the right format specifier be %hhx in this case?
> 
> So it was compiling fine on my machine, but when it was compiling for
> all possible platforms for ChromeOS those errors came up.
> The very proper thing would be probably to use "PRIu8" from <inttypes.h>
> but then I found good explanation:
> 
> ""printf() is a variadic function. Its optional arguments( and only
> those ) get promoted according to default argument promotions(
> 6.5.2.2. p6 ).
> 
> Since you are asking for integers, integer promotions are applied in
> this case, and types you mention get promoted to int. ( and not
> unsigned int because C )""
> source: http://stackoverflow.com/questions/26362386/why-is-the-format-specifier-for-uint8-t-and-uint16-t-the-same-u
> 
> so I understand that this uint8_t will get promoted to int, and
> displayed properly.
> I manually tested it for 0, 127, and 255 and looks like it's
> formatting just fine.

It's a bit unclear from your answer: do you still get warnings/errors
with %hhx or not? Looking at the warning you got:

"argument has type 'uint8_t' (aka 'unsigned char')"

and the printf(3):

"hh  A following integer conversion corresponds to a signed char or
unsigned char argument"

It'd still seem like %hhx shouldn't give a warning. Even though %x might
work too being able to be more specific in the type specification
doesn't seem like a bad thing.

Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux