C++ C++  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Неопределённое поведение C++

Профессиональный тест проверяет способность отличать конкретный вывод от ситуации, где стандарт вообще не задаёт результата. Вопросы охватывают время жизни, алиасинг, знаковое переполнение, порядок вычисления и оптимизации, которые кажутся “агрессивными” лишь потому, что исходная программа уже вышла за контракт языка.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов, время — 85 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 30
Каково поведение функции?
C++C++20
int& bad(){
    int x = 42;
    return x;
}
Вопрос 2 из 30
Почему чтение `*p` после `delete p` не становится безопасным, даже если память “ещё не перезаписана”?
C++C++20
int* p = new int(42);
delete p;

if (memory_still_looks_intact())
    std::cout << *p; // время жизни int уже закончилось
Вопрос 3 из 30
Безопасен ли `std::string_view` на результат `s.substr(...)`, если substr возвращает временную string?
C++C++20
std::string source = "abcdef";
std::string_view tail = source.substr(2);

// substr создаёт временную std::string, уничтоженную в конце инструкции.
std::cout << tail;
Вопрос 4 из 30
Можно ли читать неактивный член union как другой тип произвольно?
C++C++20
union Value {
    std::uint32_t integer;
    float real;
};
Value v{.integer = 0x3f800000};
float x = v.real; // чтение неактивного члена
Вопрос 5 из 30
Что нужно после получения сырого выровненного хранения для нетривиального T?
C++C++20
alignas(Packet) std::byte storage[sizeof(Packet)];
Packet* packet = std::construct_at(
    reinterpret_cast<Packet*>(storage), header, payload
);
use(*packet);
std::destroy_at(packet);
Вопрос 6 из 30
Почему чтение float через `reinterpret_cast<int*>(&f)` опасно?
C++C++20
float value = 1.0f;
int bits = *reinterpret_cast<int*>(&value);

std::cout << std::hex << bits;
// Доступ через int* нарушает правила алиасинга.
Вопрос 7 из 30
Через какие типы стандарт разрешает просматривать объектное представление произвольного объекта как последовательность байтов?
C++C++20
Widget object;
auto bytes = std::as_bytes(std::span{&object, 1});

for (std::byte b : bytes)
    checksum = mix(checksum, std::to_integer<unsigned char>(b));
Вопрос 8 из 30
Что делает std::bit_cast?
C++C++20
float value = 1.0f;
auto bits = std::bit_cast<std::uint32_t>(value);
static_assert(sizeof(float) == sizeof(std::uint32_t));
Вопрос 9 из 30
Почему указатель после reinterpret_cast может быть неправильно выровнен?
C++C++20
std::byte buffer[16];
std::byte* address = buffer + 1;
auto* number = reinterpret_cast<std::uint64_t*>(address);
std::uint64_t x = *number; // адрес может нарушать alignof(uint64_t)
Вопрос 10 из 30
Безопасно ли копировать trivially copyable T в массив bytes через memcpy и обратно?
C++C++20
static_assert(std::is_trivially_copyable_v<Header>);
std::array<std::byte, sizeof(Header)> bytes;
Header source{1, 2};
std::memcpy(bytes.data(), &source, sizeof source);
Header restored;
std::memcpy(&restored, bytes.data(), sizeof restored);
Вопрос 11 из 30
Каково поведение знакового переполнения int?
C++C++20
int x = std::numeric_limits<int>::max();
int y = x + 1; // знаковое переполнение
Вопрос 12 из 30
Каково поведение переполнения unsigned?
C++C++20
unsigned x = std::numeric_limits<unsigned>::max();
unsigned y = x + 1u;
// y переходит к нулю по модулю 2^N
Вопрос 13 из 30
Почему проверка `if (a + b < a)` опасна для знаковых int?
C++C++20
bool add_overflows(int a, int b) {
    return a + b < a;
}

std::cout << add_overflows(std::numeric_limits<int>::max(), 1);
Вопрос 14 из 30
Что происходит для `INT_MIN / -1` на типичном int, где результат не представим?
C++C++20
int value = std::numeric_limits<int>::min();
int result = value / -1;

std::cout << result;
// Математический результат не представим в int.
Вопрос 15 из 30
Почему сдвиг на количество бит, не меньше ширины типа, опасен?
C++C++20
std::uint32_t value = 1;
unsigned count = 32;
auto result = value << count; // count не меньше ширины типа
Вопрос 16 из 30
Почему компилятор может удалить проверку `if (p == nullptr)` после `*p`?
C++C++20
int read(const int* p) {
    int value = *p;
    if (p == nullptr)
        return 0;
    return value;
}
Вопрос 17 из 30
Что означает as-if rule?
C++C++20
int compute(int* p) {
    int before = *p;
    expensive_work();
    int after = *p;
    return before + after;
}
// оптимизатор свободен преобразовать код, если наблюдаемое поведение сохраняется
Вопрос 18 из 30
Почему signed loop может быть оптимизирован с предположением отсутствия overflow?
Вопрос 19 из 30
Гарантирует ли volatile межпоточную синхронизацию?
Вопрос 20 из 30
Почему ожидание `while (!ready) {}` небезопасно, если один поток пишет в обычный bool ready, а другой читает его без синхронизации?
Вопрос 21 из 30
Что обнаруживает UndefinedBehaviorSanitizer?
Вопрос 22 из 30
Почему программа, работающая при -O0 и ломающаяся при -O2, подозрительна на UB?
Вопрос 23 из 30
Как fuzzing помогает искать UB?
Вопрос 24 из 30
Какие предупреждения компилятора полезны для lifetime/UB?
Вопрос 25 из 30
Как минимизировать подозрительный UB-баг?
Вопрос 26 из 30
Почему “мы используем signed overflow ради скорости” плохой переносимый контракт?
Вопрос 27 из 30
Как span снижает риск UB по сравнению с голым T*?
Вопрос 28 из 30
Когда флаг `-fno-strict-aliasing` может быть временным компромиссом?
C++C++20
// Временный режим сборки старого модуля:
target_compile_options(legacy_codec PRIVATE -fno-strict-aliasing)

// Одновременно включены UBSan и план замены punning-кода
// на memcpy/std::bit_cast с отдельными тестами формата.
Вопрос 29 из 30
Почему fast path без проверки должен иметь доказанное предусловие?
Вопрос 30 из 30
Какой API безопаснее для чтения бинарного поля?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу