The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Корректная проверка на целочисленное переполнение"
Отправлено dimus, 22-Фев-06 15:07 
>Интересно, а почему не сделали набор таких функций и не включили в
>стандартную библиотеку - вещь то очень нужная. Что-то типа этого:
>int   safe_add_uint32( uint32_t val1, uint32_t val2, uint32_t* result );

Я решил сделать себе ряд таких функций. Для uint32_t и uint64_t все заработало прекрасно, и я ободренный этим, решил сделать также функции для uint8_t и uint16_t. Каково же было мое удивление и недоумение, когда эти функции незаработали!
Расследование выявило, что компилятор (gcc (GCC) 3.3.4) как-то странно рожает код для оператора if: вместо того, чтобы использовать cmpb или cmpw (для uint16_t), он использовал cmpl, и в результате функция не работает. Помогло приведение типов. Вот рабочий код:

//-------------------------------------------------------------------
// Безопасное сложение двух чисел с контролем переполнения
// val1 - первое число
// val2 - второе число
// res - указатель на переменную, в которую будет записан
// результат. В случае, если было зафиксированно переполнение,
// эта переменная останется в неизменном виде.
// Возвращаемое значение: 1 в случае успеха, 0 при переполнении
int     safe_add_uint8( uint8_t val1, uint8_t val2, uint8_t* res )
{
        int     result  = 0;

        if( (uint8_t)val1 <= (uint8_t)~val2 )
        {
                *res = val1 + val2;
                result = 1;
        }

        return  result;
}
//-------------------------------------------------------------------

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, [email protected] (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

На сайте действует частичное премодерирование - после публикации некоторые сообщения от анонимов могут автоматически скрываться ботом. После проверки модератором ошибочно скрытые сообщения раскрываются. Для ускорения раскрытия можно воспользоваться ссылкой "Сообщить модератору", указав в качестве причины обращения "скрыто по ошибке".



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру