LINUX.ORG.RU

[C] Строгий алиасинг для структур

 


0

0

Проясните, пожалуйста, пункт стандарта 6.5/7:

An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
...
— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union)

1.

struct A;
struct B;

void f(struct A *a, struct B *b)
{
  assert(a == b);
}
Компилятор может посчитать, что a != b? В данном случае неизвестно, входит ли одна структура в другую.

Не для этого ли случая нужен атрибут may_alias?

2.

struct A { int a; }
struct B { int b; struct A a; }

void f(struct A *a, struct B *b);
Очевидно, что в этом случае a != b, но по стандарту получается, что это допустимо (и для указания обратного нужно добавить restrict). Я верно понимаю? Это ведь нелогично - для алиасинга нужно, чтобы одна структура была первым членом другой.

★★★★

Ответ на: комментарий от ttnl

потому что после shall всегда инфинитив идет, родной. теперь это english, motherfucker-тред!

anonymous
()

[code]
void f(struct A *a, struct B *b)
{
assert(a == b);
}
[/code]

a и b - это указатели. Естественно, равенство не будет выполняться

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

Полагаю, как и в русском - «должен иметь», а не «должен имеет».

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

Естественно, равенство не будет выполняться

Почему?

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

> Проясните, пожалуйста, пункт стандарта 6.5/7:

Где вопрос?

anonymous
()
Ответ на: комментарий от Harald

Естественно, равенство не будет выполняться

А если так:

struct A{
  int x;
  int y;
};

struct B{
  struct A aa;
  int z;
}
Если в функции a указывает на b->aa, то a == b (по идее).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

так то да, но это частный случай

непонятно, при чем тут сравнение указателей и пункт стандарта 6.5/7

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

С какими аргументами будет вызываться функция f в обоих случаях? В тексте дано только определение функции

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

Про стандарт не знаю. Не читал. Да и при чем здесь стандарт, если он - для компилятора, а не для человека?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от AptGet

Там объясняется алиасинг, но нет ответов на мои вопросы.

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

С какими аргументами будет вызываться функция f в обоих случаях?

Это неважно. Пусть это библиотечная функция.

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

> С какими аргументами будет вызываться функция f в обоих случаях? В тексте дано только определение функции

С теми, с которыми её вызвали.

--

К.О.

anonymous
()

> Очевидно, что в этом случае a != b, но по стандарту получается, что это допустимо (и для указания обратного нужно добавить restrict). Я верно понимаю? Это ведь нелогично - для алиасинга нужно, чтобы одна структура была первым членом другой.

Судя по-всему ты не понимаешь приведённого(ых) тобой абзаца(ев)

Перефразирую: схожие типы могут ссылаться/содержать один и тот же объект, разные типы - не могут.

Структуры разных размеров не являются схожими и должны ссылаться на разные объекты, но один и тот же объект может быть вложенными в структуры/юнионы.

в твоём примере:

struct A { int a; }

struct B { int b; struct A a; }

void f(struct A *a, struct B *b);

a и b->a имееют тип struct A* и могут ссылаться на один и тот же объект; компилятор не может делать предположение, что объекты по адресам a и b->a всегда разные.

Организация полей в структуре B значения не имеет.

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

ОК, действительно, плохо подумал.

для алиасинга нужно, чтобы одна структура была первым членом другой

- это неверно. a != b, но тем не менее, алиасинг возможен, стандарт прав.

Второй вопрос закрыт.

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

При сравнении указателей вопросов aliasing'a вообще не возникает. Они возникают при разыменовании указателей.

Deleted
()
Ответ на: комментарий от unsigned

> Второй вопрос закрыт.

Какой вопрос остался «открытым»? Есть два поинтера на один и тот же тип - они могут указывать на один и тот же объект.

anonymous
()
Ответ на: комментарий от unsigned

Проблемы возникнут, когда ты попытаешья разыменовать эти неполные типы

Сделать это ты не сможешь, потому что эти типы неполные

Значит, проблем не будет

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

Ясно, спасибо.

Заклинило меня на этом сравнении указателей.

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