почему разыменование Type-наказанный указатель нарушит правило строгого псевдонима? - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь исправить предупреждения при компиляции определенной программы с использованием GCC 6. Предупреждения:

предупреждение: разыменование указателя типа-наказание нарушит правила строгого псевдонима [-Wstrict-aliasing]

и два виновника:

исходный код:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main() {

        uint8_t b[10];
        uint64_t a = 1 + 2 +3;

        *(uint64_t *)&b[2] = a;
        printf("%d\n", b[2]);

        return 0;

}

ошибка компиляции:

$ gcc-6 -O2 -Wstrict-aliasing 1.c
1.c: In function ‘main’:
1.c:10:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  *(uint64_t *)&b[2] = a;
  ^

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

Было много предложений использовать объединение - что может быть подходящим объединением для этого случая?

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