Странное поведение при проверке выравнивания данных для внешней переменной - PullRequest
0 голосов
/ 30 октября 2019

Недавно я столкнулся с некоторыми странными проблемами при попытке проверить выравнивание данных по внешней переменной.

TryDataAlignment.c

extern __attribute__((aligned(1024))) int c;


int main()
{
    printf("address of c is: %p\n", &c);
    if ((((unsigned long long) (&c) & 1023) == 0)) {
        printf("c is aligned at 1024 byte.\n");
     }
}

Переменная c была определена в другом файле: AlignmentHelper. c

int c = 2000;

Когда я компилирую код и связываю код с gcc и выполняю исполняемый файл.

gcc TryDataAlignment.c AlignmentHelper.c ./a.out

Я вижу несколько странных выходных данных:

  • адрес orignial c: 0x555555756038 => это ожидается
  • c выровнен по 1024 байта. => странное

При отладке в условии if условие корректно:

p (((unsigned long long) (&c) & 1023) == 0)
0 

Однако оно все равно входит в условия if.

Iпопытался использовать tempVar для проверки, и результат странный:

unsigned long long final = ((unsigned long long) (&c) & 1023);
if(final == 0) {
    printf("c is aligned at 1024 byte.\n");
}

Была установлена ​​точка останова при условии if, теперь у меня есть:

p ((unsigned long long) (&c) & 1023)
56
p final
0

Не уверен, что произошло во времячто назначение, кто-то может помочь с этим? Это известная проблема с gcc?

...