Spec-Zone.ru › GCC 8

6.54 Встроенные функции для выполнения арифметических операций с проверкой переполнения

Следующие встроенные функции позволяют выполнять простые арифметические операции вместе с проверкой переполнения при этих операциях.

Встроенная функция: bool __builtin_add_overflow (type1 a, type2 b, type3 *res)
Встроенная функция: bool __builtin_sadd_overflow (int a, int b, int *res)
Встроенная функция: bool __builtin_saddl_overflow (long int a, long int b, long int *res)
Встроенная функция: bool __builtin_saddll_overflow (long long int a, long long int b, long long int *res)
Встроенная функция: bool __builtin_uadd_overflow (unsigned int a, unsigned int b, unsigned int *res)
Встроенная функция: bool __builtin_uaddl_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
Встроенная функция: bool __builtin_uaddll_overflow (unsigned long long int a, unsigned long long int b, unsigned long long int *res)

Эти встроенные функции преобразуют первые два операнда в целые типы бесконечной точности со знаком и выполняют сложение этих преобразованных операндов. Результат затем приводится к типу, на который указывает третий указатель аргумента, и сохраняется там. Если сохраненный результат равен результату бесконечной точности, встроенные функции возвращают false, в противном случае они возвращают true. Поскольку сложение выполняется в бесконечной точности со знаком, эти встроенные функции имеют полностью определенное поведение для всех значений аргументов.

Первая встроенная функция допускает произвольные целые типы для операндов, а тип результата должен быть указателем на некоторый целочисленный тип, отличный от перечисления или булевого типа, остальные встроенные функции имеют явные целые типы.

Компилятор попытается использовать аппаратные инструкции для реализации этих встроенных функций, где это возможно, например, условный переход на переполнение после сложения, условный переход на перенос и т. д.

Встроенная функция: bool __builtin_sub_overflow (type1 a, type2 b, type3 *res)
Встроенная функция: bool __builtin_ssub_overflow (int a, int b, int *res)
Встроенная функция: bool __builtin_ssubl_overflow (long int a, long int b, long int *res)
Встроенная функция: bool __builtin_ssubll_overflow (long long int a, long long int b, long long int *res)
Встроенная функция: bool __builtin_usub_overflow (unsigned int a, unsigned int b, unsigned int *res)
Встроенная функция: bool __builtin_usubl_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
Встроенная функция: bool __builtin_usubll_overflow (unsigned long long int a, unsigned long long int b, unsigned long long int *res)

Эти встроенные функции аналогичны встроенным функциям проверки переполнения при сложении выше, за исключением того, что они выполняют вычитание, вычитая второй аргумент из первого, вместо сложения.

Встроенная функция: bool __builtin_mul_overflow (type1 a, type2 b, type3 *res)
Встроенная функция: bool __builtin_smul_overflow (int a, int b, int *res)
Встроенная функция: bool __builtin_smull_overflow (long int a, long int b, long int *res)
Встроенная функция: bool __builtin_smulll_overflow (long long int a, long long int b, long long int *res)
Встроенная функция: bool __builtin_umul_overflow (unsigned int a, unsigned int b, unsigned int *res)
Встроенная функция: bool __builtin_umull_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
Встроенная функция: bool __builtin_umulll_overflow (unsigned long long int a, unsigned long long int b, unsigned long long int *res)

Эти встроенные функции аналогичны встроенным функциям проверки переполнения при сложении выше, за исключением того, что они выполняют умножение, а не сложение.

Следующие встроенные функции позволяют проверить, произойдет ли переполнение при простой арифметической операции.

Встроенная функция: bool __builtin_add_overflow_p (type1 a, type2 b, type3 c)
Встроенная функция: bool __builtin_sub_overflow_p (type1 a, type2 b, type3 c)
Встроенная функция: bool __builtin_mul_overflow_p (type1 a, type2 b, type3 c)

Эти встроенные функции аналогичны __builtin_add_overflow, __builtin_sub_overflow, или __builtin_mul_overflow, за исключением того, что они не сохраняют результат арифметической операции нигде, и последний аргумент не является указателем, а некоторым выражением целого типа, отличным от перечисления или булевого типа.

Встроенные функции преобразуют первые два операнда в целые типы со знаком бесконечной точности и выполняют сложение этих преобразованных операндов. Результат затем приводится к типу третьего аргумента. Если результат приведения равен результату бесконечной точности, встроенные функции возвращают false, в противном случае они возвращают true. Значение третьего аргумента игнорируется, оцениваются только побочные эффекты в третьем аргументе, и никакие целочисленные продвижения аргументов не выполняются на последнем аргументе. Если третий аргумент является битовым полем, тип, используемый для приведения результата, имеет точность и знак заданного битового поля, а не точность и знак базового типа.

Например, следующая макрокоманда может использоваться для проверки на этапе компиляции, будет ли переполнение при сложении двух константных целых чисел, и выполнение сложения только тогда, когда известно, что оно безопасно и не приведет к предупреждению -Woverflow.

#define INT_ADD_OVERFLOW_P(a, b) \
   __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)

enum {
    A = INT_MAX, B = 3,
    C = INT_ADD_OVERFLOW_P (A, B) ? 0 : A + B,
    D = __builtin_add_overflow_p (1, SCHAR_MAX, (signed char) 0)
};

Компилятор попытается использовать аппаратные инструкции для реализации этих встроенных функций, например, условный переход на переполнение после сложения, условный переход на перенос и т. д.

Далее: x86-специфичные расширения модели памяти для транзакционной памяти, Предыдущее: __atomic Встроенные функции, Вверх: Расширения C [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Integer-Overflow-Builtins.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API