QUIZCPP Telegram 1519
Какой результат даст выражение CharTable {}.is_printable(0x81) на x86?
struct CharTable {
  static_assert(CHAR_BIT == 8);
  std::array<bool, 256> _is_printable {};
  CharTable() {
    _is_printable.fill(true);
    _is_printable[0x81] = false;
  }
  bool is_printable(char c) const {
    return this->_is_printable[c];
  }
};

Зависит от платформы и знаковости char! На ARM этот код работает корректно. Там char беззнаковый.

На x86 в коде будет неопределённое поведение. Знаковый char 0x81 (-127) при передаче в std::array<T, N>::operator[](size_t) становится большим беззнаковым числом, которое больше размера массива. Мы получаем выход за границу массива и все вытекающие из этого проблемы. С очень большой вероятностью вызов упадёт с ошибкой сегментации.

https://godbolt.org/z/Wzzbdj1d9

Задачка из квиза по неопределённому поведению Дмитрия Свиридкина, опубликована на сайте PVS-Studio.



tgoop.com/quizcpp/1519
Create:
Last Update:

Какой результат даст выражение CharTable {}.is_printable(0x81) на x86?

struct CharTable {
  static_assert(CHAR_BIT == 8);
  std::array<bool, 256> _is_printable {};
  CharTable() {
    _is_printable.fill(true);
    _is_printable[0x81] = false;
  }
  bool is_printable(char c) const {
    return this->_is_printable[c];
  }
};

Зависит от платформы и знаковости char! На ARM этот код работает корректно. Там char беззнаковый.

На x86 в коде будет неопределённое поведение. Знаковый char 0x81 (-127) при передаче в std::array<T, N>::operator[](size_t) становится большим беззнаковым числом, которое больше размера массива. Мы получаем выход за границу массива и все вытекающие из этого проблемы. С очень большой вероятностью вызов упадёт с ошибкой сегментации.

https://godbolt.org/z/Wzzbdj1d9

Задачка из квиза по неопределённому поведению Дмитрия Свиридкина, опубликована на сайте PVS-Studio.

BY С++ задачи и вопросы




Share with your friend now:
tgoop.com/quizcpp/1519

View MORE
Open in Telegram


Telegram News

Date: |

fire bomb molotov November 18 Dylan Hollingsworth yau ma tei 6How to manage your Telegram channel? 4How to customize a Telegram channel? The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. 3How to create a Telegram channel?
from us


Telegram С++ задачи и вопросы
FROM American