tgoop.com/quizcpp/1519
Create:
Last Update:
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