Рубрика «переполнение int»

Эта статья посвящена неопределённому поведению и оптимизациям компилятора, особенно в контексте знакового целочисленного переполнения.

Примечание от переводчика: в русском языке нет четкого соответствия в употребляемом контексте слова «wrap»/«wrapping». Существует математический термин "перенос", который близок к описываемому явлению, а термин "флаг переноса" (carry flag) — механизм выставления флага в процессорах при целочисленном переполнении. Другим вариантом перевода может быть фраза «вращение/переворот/оборот вокруг нуля». Она лучше отображает смысл «wrap» по сравнению с «перенос», т.к. показывает переход чисел при переполнении из положительного в отрицательный диапазон. Однако, как оказалось, эти слова смотрятся в тексте непривычно для тестовых читателей. Для упрощения в дальнейшем примем в качестве перевода термина «wrap» слово «перенос».

Компиляторы языка C (и C++) в своей работе всё чаще руководствуются понятием неопределённого поведения — представлением о том, что поведение программы при некоторых операциях не регламентировано стандартом и что, генерируя объектный код, компилятор вправе исходить из предположения, что программа таких операций не производит. Немало программистов возражало против такого подхода, поскольку сгенерированный код в этом случае может вести себя не так, как задумывал автор программы. Эта проблема становится всё острее, так как компиляторы применяют всё более хитроумные методы оптимизации, которые наверняка будут опираться на понятие неопределённого поведения.
Читать полностью »

Недавно мой друг показал мне ошибку, которая проявляется в простой функции, вычисляющей полиномиальный хеш от строки с переполнением int'a. Она возвращала отрицательное число, хотя не должна была. Вот сама функция:

unsigned MAX_INT = 2147483647;
 
int hash_code(std::string x) {
    int h = 13;
    for (unsigned i = 0; i < 3; i++) {
        h += h * 27752 + x[i];
    }
    if (h < 0) h += MAX_INT;
    return h;
}

На некоторых строках, в частности, на строке «bye», и только на сервере (что интересно, на своем компьютере все было в порядке) функция возвращала отрицательное число. Но как же так, ведь в случае, если число отрицательное, к нему прибавится MAX_INT и оно должно стать положительным.
Читать полностью »

Diablo III от Blizzard – популярная онлайновая Action/RPG, выпущенная почти год назад, получила свою долю технических неполадок. От Error 37 до лагов, которые выливаются в сотни зря потраченных часов, но весь прошедший год Blizzard провела за отладкой бекэнда для того, чтобы он лучше справлялся с миллионами активных игроков.

Diablo III также можно отметить за реальную экономику, с акцентом на региональные Аукционные Дома, где игроки могут продавать редкие предметы за золото, которое исчисляется миллионами и миллиардами (инфляция сумасшедшая). Кроме того в Diablo III используется Real World Auction House, где игроки могут продать золото или предметы за деньги реального мира.

Вчера был выпущен Патч 1.0.8, который должен был улучшить прогресс персонажей. После нескольких недель тестирования в Public Test Realm, где добровольцы обкатывают патч для того, чтобы понять, что он не нанесет никакого вреда игре, патч был успешно опубликован.

Да, патч был полностью протестирован в PTR – но за исключением одной мелкой доработки, добавленной в последнюю минуту. И эта доработка порвала экономику игры на мелкие кусочки.

Экономика Diablo III была разрушена целочисленным переполнениемЧитать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js