приведение без знака char * (uint8_t *) к const char * - PullRequest
4 голосов
/ 10 августа 2011

У меня есть функция, которая принимает аргумент uint8_t *:

uint8_t* ihex_decode(uint8_t *in, size_t len, uint8_t *out)
{
    uint8_t i, hn, ln;

    for (i = 0; i < len; i+=2) {
        hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
        ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

        out[i/2] = (hn << 4 ) | ln;
    }

    return out;
}

Я использую эту функцию с:

uint8_t data[SPM_PAGESIZE]; // SPM_PAGESIZE = 256 bytes
uint8_t sysex_data[SPM_PAGESIZE/2];
ihex_decode(data, strlen(data), sysex_data);

Но в этом случае мой компилятор (avr-gcc) возвращает предупреждение:

main.c | 89 | предупреждение: цели указателя в передаваемом аргументе 1 из 'strlen' отличаются подписью /usr/include/string.h|399|note: Ожидается 'const char * 'но аргумент имеет тип' uint8_t * '

Итак, я нашел решение, приведя тип к типу данных var:

ihex_decode(data, strlen((const char *)data), sysex_data);

Предупреждение исчезает, ноИнтересно, безопасно ли это решение?

Есть ли лучший способ?

Спасибо

Ответы [ 4 ]

4 голосов
/ 10 августа 2011

Это безопасно. Ошибка связана с смешиванием беззнаковых целых 8 битов с символами, которые подписываются, если вы используете только char.

Я вижу, однако, что функция принимает uint8_t и выполняет char действительную арифметику, поэтому она должна принимать char с (или const char с). Обратите внимание, что символьная константа 'c' имеет тип char, и вы смешиваете знаки со знаком и без знака в выражениях внутри ihex_decode, поэтому вы должны быть осторожны, чтобы избежать переполнения или отрицательных чисел, рассматриваемых как большие положительные числа.

Последнее примечание стиля. Поскольку in не изменяется, в параметрах должно быть указано const uint8_t* in (или const char* in, как указано выше). Другая ошибка стиля (которая может привести к очень серьезным ошибкам) ​​заключается в том, что вы принимаете len как size_t, но объявляете переменную цикла i как uint8_t. Что если длина строки более 255 байт?

1 голос
/ 10 августа 2011

Это безопасно.Предупреждение (я думаю) всплывает, потому что вы переходите от неподписанного к подписанному.

1 голос
/ 10 августа 2011

Все, что не является const *, может быть безопасно приведено к const * в C. Это экономит.

0 голосов
/ 10 августа 2011

Безопасно, диапазон char

...