Вопросы по теме 'strict-aliasing'

Псевдоним строгого указателя: любое решение для конкретной проблемы?
У меня проблема, вызванная нарушением строгого правила псевдонима указателя. У меня есть тип T , полученный из шаблона, и некоторый интегральный тип Int того же размера (как и sizeof ). Мой код по существу делает следующее: T x =...
806 просмотров

Псевдоним строгого указателя: является ли доступ через «изменчивый» указатель/ссылку решением?
По пятам конкретной проблемы , самостоятельный ответ и комментарии к нему, я хотел бы понять, является ли это правильным решением, обходным путем/взломом или просто неправильным. В частности, я переписал код: T x = ...; if (*reinterpret_cast...
1482 просмотров

Разыменование указателя с символом типа нарушит строгие правила псевдонимов
Я использовал следующий фрагмент кода для чтения данных из файлов как части более крупной программы. double data_read(FILE *stream,int code) { char data[8]; switch(code) { case 0x08: return (unsigned...
78270 просмотров
schedule 06.10.2022

Беззнаковый символ a [4] [5]; а [1] [7]; неопределенное поведение?
Один из примеров неопределенного поведения из стандарта C гласит (J.2): - Индекс массива выходит за пределы допустимого диапазона, даже если объект явно доступен с заданным индексом (как в выражении lvalue a [1] [7] при объявлении int a [4]...
708 просмотров

Строгие псевдонимы и обратные вызовы с пользовательскими данными
У меня есть библиотека С++ с C API на основе обратного вызова. Тип обратного вызова выглядит следующим образом: typedef struct {...} Result; typedef void (*callback) (const Result* result, void* userData); Пользователь может зарегистрировать...
749 просмотров
schedule 14.10.2022

Об общем указателе на char и строгом псевдониме
Я не знаю, почему следующий код работает нормально, без ошибок gcc ( -fstrict-aliasing -Wstrict-aliasing=1 ). #include <stdio.h> int main(void) { char n = 42; char *p = &n; int *q = (int *)p; *q = 10;...
195 просмотров
schedule 01.08.2023

Псевдоним T* с char* разрешен. Допускается ли и наоборот?
Примечание. Этот вопрос был переименован и сокращен, чтобы сделать его более точным и понятным. Большинство комментариев относятся к старому тексту. Согласно стандарту, объекты разных типов не могут использовать одну и ту же ячейку памяти....
3440 просмотров

Нарушает ли это приведение указателя строгое правило сглаживания?
Это быстрая реализация метода вычисления обратного квадратного корня из Quake III Arena: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number;...
1117 просмотров
schedule 06.08.2023

Строгий псевдоним кажется непоследовательным
Было несколько ошибок из-за строгого алиасинга, и я решил попытаться исправить их все. При детальном рассмотрении того, что это такое, иногда кажется, что GCC не выдает предупреждения, а также что некоторые вещи невозможно реализовать. По крайней...
438 просмотров
schedule 01.05.2022

доступ к длинному двухбитному представлению
TLDR; Вызывает ли следующий код неопределенное (или неопределенное) поведение? #include <stdio.h> #include <string.h> void printme(void *c, size_t n) { /* print n bytes in binary */ } int main() { long double value1 = 0; long...
1474 просмотров
schedule 02.11.2023

Сопоставление массивов с помощью структур
Я читаю параграф 7 из 6.5 стандарта ISO / IEC 9899: TC2. Он оправдывает доступ lvalue к объекту посредством: тип агрегата или объединения, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член...
1320 просмотров

Можно ли преобразовать выровненные структуры внутри объединения в объединение для доступа к выровненным полям?
Я пытаюсь понять, что именно вы получаете от сервитута для выровненных переменных в C99: Исключение из строгого правила псевдонимов в C из 6.5.2.3 Члены структуры и объединения Дает ли это вам карт-бланш на приведение к этому союзу, если...
271 просмотров
schedule 02.12.2022

Избегание строгого нарушения псевдонимов в хэш-функции
Как я могу избежать строгого нарушения правил псевдонимов, пытаясь изменить char* результат функции sha256. Вычислить хеш-значение: std::string sha = sha256("some text"); const char* sha_result = sha.c_str(); unsigned long* mod_args =...
168 просмотров
schedule 11.06.2024

Будет ли это нарушение правила строгого сглаживания вести себя так, как я ожидаю?
Я знаю, что нарушение строгого правила псевдонимов является неопределенным поведением в соответствии со стандартом C. Пожалуйста, не говорите мне, что это УБ и тут не о чем говорить. Я хотел бы знать, есть ли компиляторы, которые не будут иметь...
97 просмотров
schedule 07.01.2024

Союзы и строгое сглаживание в C11
Предполагая, что у меня есть такой союз union buffer { struct { T* data; int count; int capacity; }; struct { void* data; int count; int capacity; } __type_erased; }; Не возникнут ли у меня проблемы, если я смешаю чтение/запись с...
974 просмотров

(Как) я должен уничтожить uv_async_t?
После того, как я закончу с uv_async_t , я должен уничтожить его, чтобы избежать утечек, верно? Глядя на документы, кажется, что я должен использовать для этого uv_close() , но для этого требуется uv_handle_t* , а не uv_async_t* . Кроме того,...
507 просмотров
schedule 28.11.2022

memcpy из одного типа в другой. Как мы получим доступ к месту назначения после этого?
uint32_t u32 = 0; uint16_t u16[2]; static_assert(sizeof(u32) == sizeof(u16), ""); memcpy(u16, &u32, sizeof(u32)); // defined? // if defined, how to we access the data from here on? Это определенное поведение? И если да, то какой тип...
391 просмотров
schedule 15.12.2022

Можно ли правильно использовать std::aligned_storage только через новое размещение?
Прочитал несколько строгих вопросов о псевдонимах, таких как Приведение массива байтов к POD или ​​Псевдоним ` T*` с `char*` допускается. Разрешено ли и наоборот? Из них я делаю вывод, что единственный законный способ доступа к ячейке...
231 просмотров
schedule 28.07.2023

c++ - тип каламбура из указателя без знака char, когда известен базовый тип
Вызывает ли следующая программа какое-либо неопределенное поведение? В частности, нарушает ли это какие-либо строгие правила псевдонимов? void zeroInt(unsigned char *mem) { *reinterpret_cast<int *>(mem) = 0; } int main() { int...
530 просмотров

Реализация контейнера в виде массива против строгого псевдонима
Я пытаюсь реализовать контейнер, похожий на массив, с некоторыми особыми требованиями и подмножеством интерфейса std::vector . Вот фрагмент кода: template<typename Type> class MyArray { public: explicit MyArray(const uint32_t size) :...
84 просмотров