Вопросы по доработке - PullRequest
       2

Вопросы по доработке

3 голосов
/ 26 августа 2011

У меня есть вопросы по поводу типизации. Это просто фиктивная программа, показанная здесь. Фактический код слишком велик для публикации.

typedef struct abc
{
    int a;
}abc_t;

main()
{
    abc_t *MY_str;
    char *p;
    MY_str = (abc_t *)p;
 }

Каждый раз, когда я запускаю инструмент проверки анализа качества, я получаю предупреждение уровня 2:

Casting to different object pointer type. REFERENCE - ISO:C90-6.3.4 Cast Operators - Semantics <next> Msg(3:3305) Pointer cast to stricter alignment. <next>

Может кто-нибудь сказать, пожалуйста, как решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

Простой - ваш инструмент статического анализа (который, между прочим?) Решил, что char* не имеет определенного требования к выравниванию (оно может указывать где-либо в памяти), тогда как abc_t*, вероятно, имеет требование к выравниванию слов (int должно быть на границе 4/8 байта).

В действительности, поскольку char* находится в стеке, оно будет выровнено по словам на большинстве архитектур. Ваш инструмент не может видеть это.

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

Ваш код недействителен C. Если вы обнаружите, что делаете что-то подобное, это, вероятно, является результатом большего недопонимания.Например, я предполагаю, что вы хотите прочитать объект abc_t из файла / сокета / и т. Д.и вы привыкли передавать указатель char на read / recv / любую функцию.Вместо этого вы должны просто объявить объект типа abc_t и передать его адрес любой функции чтения, которую вы используете.

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

a char* может быть выровнено по любой границе байта, что означает, что если вы приведете ее к структуре, требования к выравниванию этой структуры могут быть не выполнены (например, 16-байтовые границы, необходимые для типов SIMD).

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

В вашей реализации (и, вероятно, во многих других) каждый int должен находиться по адресу, который делится на sizeof int, который часто равен 4.

С другой стороны, char может быть по любому адресу.

Это похоже на присвоение 3.25 переменной int. Это также невозможно.

Таким образом, если у вас есть неверный указатель , вы, вероятно, получите исключение от вашей машины, и технически этот код вызывает неопределенное поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...