LINUX.ORG.RU

Глюк GCC?


0

1

Программа ниже, если собирать с -O2 (или -O3), то вывод получается примерно такой:

------- 0x08724018 0x00000000 0x08724008
А если с -O1, то такой (какой и ожидался):
------- 0x09917018 0x09917008 0x09917008

Это я где-то не доглядел или глюк GCC?

Художественные достоинства кода просьба не обсуждать, если они не связанны непосредственно с проблемой - это вырезка из большой программы.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

typedef struct List_t
{
  struct List_t *next;
} List_t;

typedef struct Symbol_t
{
  struct Symbol_t *next;
} Symbol_t;

typedef struct First_t
{
  Symbol_t       *set;
} First_t;

static void list_add(void **list, void *element)
{
  ((List_t *)element)->next = NULL;

  if (*list)
  {
    List_t *last = *list;
    while (last->next)
      last = last->next;
    last->next = element;
  }
  else
    *list = element;
}

int main(void)
{
  First_t *item;
  Symbol_t *res;

  res = malloc(sizeof(Symbol_t));
  res->next = NULL;

  item = malloc(sizeof(struct First_t));
  item->set = NULL;
  list_add((void *)&item->set, res);

  printf("------- 0x%08lx 0x%08lx 0x%08x\n", item, item->set, res);
  return 0;
}
★★★★

Последнее исправление: alexru (всего исправлений: 1)
Ответ на: комментарий от Yareg

list.h, но чего-то я попробовал с этими списками шиворот-на-выворот работать и мне не понравилось, очень тяжело следить, чтобы что-то не накосячить.

alexru ★★★★
() автор топика

Я так и не вкурил в чём баг... Даже листинги посмотрел. Такое ощущение, что компилятор считает, что значение по переданному указателю не может поменятся...

Yareg ★★★
()
Ответ на: комментарий от Yareg

То что это не баг мы выяснили уже 2 дня назад, можно читать не только листинги, но и все обсуждение :)

alexru ★★★★
() автор топика
Ответ на: комментарий от Yareg

Да, компилятор именно считает, что переменная не может измениться, так как внутрь функции она попала не по своему имени, а через void *. Требование, чтобы указатели всегда использовались только со своим оригинальным типом - это strict aliasing. -fno-strict-aliasing говорит GCC, что так думать нельзя.

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.