Я пытаюсь исправить предупреждения при компиляции определенной программы с использованием 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;
^
Это выглядит несколько иначе, чем в других примерах. предупреждение я осматривал. Я предпочел бы исправить проблему, а не отключать проверки с использованием строгих псевдонимов.
Было много предложений использовать объединение - что может быть подходящим объединением для этого случая?