Тут зависит от алгоритма шифрования. Если алгоритм основан на генерации случайных чисел и каждый код вносится в их базу данных, то нет. Когда пользователь вводит код, то система вычисляет контрольную сумму и таким образом отсекает большинство невалидных кодов. (тут ты можешь сам сгенерировать код с данной контрольной суммой, тем самым обойдя проверку) Если сумма совпала, то уже делается поиск по их бд (А вот тут ты ничего не сможешь сделать) и если такого кода нет в бд, то это повод для того, чтобы пристально за тобой начать следить, подозревая в мошенничестве.
Для UB достаточно чтения с 2 указателей разного типа. А откуда инфа, что только в пределах 1 функции?! Или это просто наблюдения нескольких компиляторов. Если второе, то всё плохо. Вон, люди memcpy для заполнения памяти последовательностью использовали. Везде работало, а потом раз и перестало. С UB шутки плохи, ибо оно проявляется неожиданно и может долгое время не давать о себе знать.
f и i не должны ссылаться на один и тот же блок памяти, ибо они имеют разный тип. volatile не убирает UB. А UB означает, что может произойти, что угодно.
Можете пояснить будет ли мой случай нарушать strict aliasing. Пишу абстрактный вектор на C11, чтобы можно было использовать [] структура вектора в памяти такая:
+------+----------+---------+
| size | capacity | data… |
+------+----------+---------+
Пользовательский указатель указывает на data. В ряде функций, связанных с этим вектором необходимо получить size. Для этого необходимо от переданного пользовательского указателя отнять 16 байт и считать/записать size_t. Будет ли нарушать правило strict aliasing следующий код?
Для UB достаточно чтения с 2 указателей разного типа. А откуда инфа, что только в пределах 1 функции?! Или это просто наблюдения нескольких компиляторов. Если второе, то всё плохо. Вон, люди memcpy для заполнения памяти последовательностью использовали. Везде работало, а потом раз и перестало. С UB шутки плохи, ибо оно проявляется неожиданно и может долгое время не давать о себе знать.
f и i не должны ссылаться на один и тот же блок памяти, ибо они имеют разный тип. volatile не убирает UB. А UB означает, что может произойти, что угодно.
+------+----------+---------+
| size | capacity | data… |
+------+----------+---------+
Пользовательский указатель указывает на data. В ряде функций, связанных с этим вектором необходимо получить size. Для этого необходимо от переданного пользовательского указателя отнять 16 байт и считать/записать size_t. Будет ли нарушать правило strict aliasing следующий код?