проверка на переполнение ржавчины на нескольких целочисленных операциях подряд - PullRequest
0 голосов
/ 15 марта 2020

Как я могу проверить переполнение на всех этапах

fn somemath() -> u32 {
   let x: u32 = y * 3 + 2;
   return x
}

, что-то похожее на

fn somemath() -> u32 {
    let x: u32 = y.checked_mul(3).checked_add(2)
    return x
}

Или как лучше всего избежать переполнения в таких случаях? В конце мне нужно, чтобы x не производил переполнения и был допустимым результатом или приводил к ошибке, и может ли функция вернуть u32 в случае успеха?

1 Ответ

0 голосов
/ 15 апреля 2020

Вам решать, нужна ли проверка, и что делать, если она переполнена.

Если нет значимого результата в случае переполнения, вы можете вернуть Option::None, например:

fn somemath(y: u32) -> Option<u32> {
    let x: u32 = y.checked_mul(3)?.checked_add(2)?;
    return Some(x);
}

fn somemath(y: u32) -> Option<u32> {
    y.checked_mul(3)?.checked_add(2) // same, but shorter
}

Вы также можете проверить, достаточно ли малы входные данные, чтобы переполнение никогда не происходило. Или вы можете использовать больший тип для промежуточных значений (например, u64 здесь), чтобы получить действительный результат для любого u32 ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...