Описание тега strict-aliasing

Строгий псевдоним - это сделанное компилятором C или C++ допущение, что указатели разыменования объектов разных типов никогда не будут ссылаться на одно и то же место в памяти (т.е. они не будут использовать псевдонимы друг для друга).
2 ответа

Каким образом этот код псевдонимов для структурных полей вызывает неопределенное поведение

Учитывая код: #include <stdlib.h> #include <stdint.h> typedef struct { int32_t x, y; } INTPAIR; typedef struct { int32_t w; INTPAIR xy; } INTANDPAIR; void foo(INTPAIR * s1, INTPAIR * s2) { s2->y++; s1->x^=1; s2->y--; s1->x^=1…
26 ноя '15 в 23:14
0 ответов

Значение унарного `&` применяется к члену профсоюза

Обычно в С, используя одинарный & Оператор в lvalue дает указатель, так что в любое время в течение времени жизни базового объекта, применяя унарный * указатель выдаст lvalue, эквивалентный оригиналу. Такое поведение по сути является смыслом &am…
23 апр '17 в 18:46
2 ответа

Cuda type punning - memcpy против UB union

В не-Cuda C++-коде в настоящее время предлагается практика, заключающаяся в том, что вместо объединения UB следует использовать штампование типов через memcpy. Несмотря на то, что это может вызывать проблемы с производительностью в сборках Debug, и …
31 окт '17 в 13:52
1 ответ

C преодоление ограничений на псевдонимы (союзы?)

Предположим, у меня есть пример исходного файла test.c, который я собираю следующим образом: $ gcc -03 -Wall test.c выглядит примерно так... /// CMP128(x, y) // // arguments // x - any pointer to an 128-bit int // y - any pointer to an 128-bit int /…
26 июн '11 в 21:17
3 ответа

Освободить / удалить объединение malloc/new Array в C/C++

Я работал и собирался использовать профсоюз. Я отказался от этого, потому что дизайн действительно требовал структуры / класса, но это в конечном итоге привело к следующему гипотетическому вопросу: Предположим, у вас есть союз, подобный этому надума…
29 июн '12 в 03:57
2 ответа

Разрешают ли строгие правила псевдонимов в C++11 доступ к uint64_t через char *, char(&)[N], даже std:: array<char, N>& с -fstrict-aliasing -Wstrict-aliasing=2?

Согласно этому стеку потока ответ о строгих правилах псевдонимов C++ 11/14: Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличный от одного из следующих типов, поведение не определено: динамический тип объек…
21 дек '17 в 09:26
1 ответ

Можно ли использовать один блок памяти для хранения нескольких объектов?

Я реализую очень странную структуру, в которой я выделяю один фрагмент памяти и сохраняю в нем несколько объектов разного типа: auto memory = reinterpret_cast&lt;std::uintptr_t&gt;(::operator new(size)); new(reinterpret_cast&lt;void*&gt;(memory)) Cl…
25 фев '18 в 15:38
4 ответа

Строгое правило алиасинга и строгая реализация glibc

Некоторое время я читал о строгом правиле псевдонимов, и я начинаю запутываться. Прежде всего, я прочитал эти вопросы и некоторые ответы: строгие ступенчатости-правила и символьные указатели когда-это-углеродно безопасная для-строгого указатель сгла…
08 июн '17 в 22:41
2 ответа

Это действительно нарушает правила строгого наложения имен?

Когда я компилирую этот пример кода с использованием g++, я получаю это предупреждение: предупреждение: разыменование указателя типа-наказанного нарушит правила строгого наложения имен [-Wstrict-aliasing] Код: #include &lt;iostream&gt; int main() { …
18 ноя '14 в 20:49
2 ответа

Является ли ключевое слово restrict бессмысленным для параметров уникальных типов указателей?

Я заметил интенсивное использование restrict Ключевое слово в одном из наших старых проектов.Я понимаю обоснование restrict, но я ставлю под сомнение его полезность применительно к некоторым из этих функций. Возьмите следующие два примера: void func…
4 ответа

Структура над гибким членом массива

Я пишу программу на C (g++ compilable), которая имеет дело с множеством различных структур, все из буфера с предопределенным форматом. Формат определяет, какой тип структуры я должен загрузить. Это может быть решено с помощью союзов, но огромная раз…
25 июн '18 в 07:21
2 ответа

Строгое наследование и наложение наследования

Рассмотрим этот пример кода: #include &lt;stdio.h&gt; typedef struct A A; struct A { int x; int y; }; typedef struct B B; struct B { int x; int y; int z; }; int main() { B b = {1,2,3}; A *ap = (A*)&amp;b; *ap = (A){100,200}; //a clear http://port70.…
20 фев '17 в 19:20
2 ответа

Два массива в объединении в C++

Можно ли разделить два массива в объединении следующим образом: struct { union { float m_V[Height * Length]; float m_M[Height] [Length]; } m_U; }; У этих двух массивов одинаковый объем памяти или один из них длиннее?
09 июл '12 в 11:06
2 ответа

C++ строгая проблема с алиасами --- сводит меня с ума

Хорошо... Я отчаянно пытаюсь заставить этот код работать с включенным строгим псевдонимом (и -O3).Я не смог сократить код (sry...), поэтому он довольно длинный ~170 строк... struct S { enum { leaf, node } type; // the type of the structure. leaf mea…
06 сен '11 в 16:56
3 ответа

Может ли std::array alias быть фрагментом большего массива?

Предположим, у нас есть указатель T* ptr; а также ptr, ptr+1, … ptr+(n-1) все относятся к действительным объектам типа T. Можно ли получить к ним доступ, как если бы они были STL array? Или делает следующий код: std::array&lt;T,n&gt;* ay = (std::arr…
08 апр '16 в 20:42
1 ответ

Это ошибка повторного использования хранилища (aliasing) в gcc 6.2?

Из того, что я могу сказать, следующий код должен иметь 100% определенное поведение при любом разумном прочтении Стандарта для платформ, которые определяют int64_t, и где long long имеет одинаковый размер и представление независимо от того, long lon…
30 авг '16 в 22:26
1 ответ

Наложение многомерных массивов

Хорошо известно, что 2D-массив является массивом массивов, и что по стандарту требуется, чтобы он был непрерывно размещенным непустым набором объектов (6.2.5 Types §20) - объект здесь является одномерным массивом. Также хорошо известно, что для всех…
0 ответов

Как это может исправить строгое соответствие псевдонимов?

Следующая программа генерирует ошибку компиляции error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] (gcc 4.7.3 с -std= C++0x -O3 -Wall -Werror) #include &lt;cstring&gt; #include &lt;iostream&gt; struc…
14 авг '14 в 09:39
2 ответа

Действительно ли строгое правило псевдонимов - это улица с двусторонним движением?

В этих комментариях пользователь @Deduplicator настаивает на том, что правило строгого псевдонима разрешает доступ через несовместимый тип, если указатель с псевдонимом или псевдонимом является указателем на символьный тип (квалифицированный или нек…
06 июл '14 в 17:16
1 ответ

Приведение из указателя на функцию-член к другому типу и обратно, проблема строгого наложения имен?

Я написал класс для хранения либо указателя функции, либо указателя на функцию-член (не одновременно). Когда я сохраняю указатель на функцию-член, я также сохраняю указатель на объект (получатель). Проблема в том, что я заранее не знаю ни типа объек…