избавление от предупреждений sscanf () - PullRequest
1 голос
/ 17 февраля 2010

Я читаю MAC-адреса (в стандартной шестнадцатеричной записи, например, 00: 11: 22: 33: 44: 55) из стандартного ввода и преобразую их в 6-байтовую переменную hw_addr в виде десятичных дробей:

u8 hw_addr[6];

scanf("%2x:%2x:%2x:%2x:%2x:%2x", &hw_addr[0], &hw_addr[1], &hw_addr[2], &hw_addr[3], &hw_addr[4], &hw_addr[5]);

Единственная проблема в том, что я получаю 6 предупреждений от scanf:

warning: format '%2x' expects type 'unsigned int *', but argument 3 has type 'u8 *'

.....

Есть ли способ избавиться от этих предупреждений, не тратя int на каждое поле?

Ответы [ 4 ]

4 голосов
/ 17 февраля 2010

Согласно моей scanf справочной странице,

 hh       Indicates that the conversion will be one of dioux or n
          and the next pointer is a pointer to a char (rather than
          int).

Итак, вы хотите "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx"

4 голосов
/ 17 февраля 2010

Просто используйте правильный тип

Итак, вы используете машину с миллиардами байт оперативной памяти и хотите сохранить 6 из них?

Если вы храните массив из миллионовMac адресов вы должны преобразовать их в упакованный формат после прочтения.Но никакой вред не причиняется путем предоставления канонических целочисленных значений для scanf ().

В этом отношении, если hw_addr[] является локальной переменной, то она фактически вообще не использует пробела, поскольку будет использоваться для другихlocals после того, как ваша функция вернется.

Поскольку вы не можете все оптимизировать, важно сосредоточить усилия по оптимизации на вещах, которые действительно имеют значение.

2 голосов
/ 17 февраля 2010

Предупреждения свидетельствуют о серьезной проблеме. Вы передаете указатели на неподписанные байты, но функция scanf будет записывать в них 32 бита. Для первых 3 значений дополнительные 24 бита будут перезаписывать части массива hw_addr, но для последних 3 значений вы перезаписываете некоторую переменную other в стеке.

Чтобы избежать серьезного сбоя, по крайней мере, вам нужно перераспределить hw_addr

u8 hw_addr[6+3];

По крайней мере предотвратит ваш код от разрушения стека. Но на самом деле, вы должны просто использовать значения правильного размера для scanf и впоследствии конвертировать из целых чисел в байты без знака.

1 голос
/ 17 февраля 2010

вы читаете unsigned int в адрес char, это может быть не очень переносимо или безопасно.просто используйте массив int в качестве буфера для чтения, а затем скопируйте его в байтовый массив

...