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

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

 



Hi Johan,

On Mon, Oct 19, 2015 at 11:51 PM, Johan Hedberg <johan.hedberg@xxxxxxxxx> wrote:
> 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.

Ok, I've build version with %hhx on all platforms we have and it
worked well with no warnings. I'll update patch.

>
> 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