Вопросы по теме 'strict-aliasing'
Псевдоним строгого указателя: любое решение для конкретной проблемы?
У меня проблема, вызванная нарушением строгого правила псевдонима указателя. У меня есть тип T , полученный из шаблона, и некоторый интегральный тип Int того же размера (как и sizeof ). Мой код по существу делает следующее:
T x =...
806 просмотров
schedule
22.06.2022
Псевдоним строгого указателя: является ли доступ через «изменчивый» указатель/ссылку решением?
По пятам конкретной проблемы , самостоятельный ответ и комментарии к нему, я хотел бы понять, является ли это правильным решением, обходным путем/взломом или просто неправильным.
В частности, я переписал код:
T x = ...;
if (*reinterpret_cast...
1482 просмотров
schedule
17.05.2023
Разыменование указателя с символом типа нарушит строгие правила псевдонимов
Я использовал следующий фрагмент кода для чтения данных из файлов как части более крупной программы.
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 просмотров
schedule
06.07.2022
Строгие псевдонимы и обратные вызовы с пользовательскими данными
У меня есть библиотека С++ с 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 просмотров
schedule
26.05.2022
Нарушает ли это приведение указателя строгое правило сглаживания?
Это быстрая реализация метода вычисления обратного квадратного корня из 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 просмотров
schedule
10.04.2023
Можно ли преобразовать выровненные структуры внутри объединения в объединение для доступа к выровненным полям?
Я пытаюсь понять, что именно вы получаете от сервитута для выровненных переменных в 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 просмотров
schedule
09.02.2023
(Как) я должен уничтожить 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 просмотров
schedule
12.05.2023
Реализация контейнера в виде массива против строгого псевдонима
Я пытаюсь реализовать контейнер, похожий на массив, с некоторыми особыми требованиями и подмножеством интерфейса std::vector . Вот фрагмент кода:
template<typename Type>
class MyArray
{
public:
explicit MyArray(const uint32_t size) :...
84 просмотров
schedule
03.03.2023