Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
#1

Переполнения безопастны? - C++

08.05.2017, 11:59. Просмотров 239. Ответов 13

Насколько безопасна строчка:
C++
1
for(unsigned int b(UINT_MAX); ++b != UINT_MAX;)
или такое нужно писать только так:
C++
1
2
3
unsigned int b(0);
do{/*code*/}
while(b != UINT_MAX)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2017, 11:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переполнения безопастны? (C++):

Защита от переполнения - C++
Ребят помоги создать защиту от переполнения через функцию scanf_s и убрать нолики в конечном ответе, вот код: #include <stdio.h> ...

СИ++ и контроль переполнения - C++
Можно ли как-нибудь в VS включить контроль переполнения при математических вычислениях? Чтоб, например, возникало исключение. Или это можно...

Флаг переполнения - C++
Доброго времени суток! Подскажите, как проверить какую-либо определенную переменную типа double на переполнение (значениe -1.#IND00,...

Как отловить переполнения? - C++
Есть проект dll, в в нём экспортируемая функция, возвращающая BOOL, требуется при переполнении любой вещественной операции в теле этой...

Ошибка переполнения буфера - C++
При первом запуске програма работает, после второго появляеться ошибка переполнения буфера. В чем дело?#include <iostream> #include...

Ошибка переполнения массива - C++
Здравствуйте. Задача легкая,нужно создать массив из 1000000 элементов,и найти 1000001,и вывести сообщение что не найден такой элемент. Но...

13
nmcf
08.05.2017, 12:54
  #2

Не по теме:

А зачем так делать?

0
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,354
Записей в блоге: 30
08.05.2017, 14:10 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Какой смысл ты вкладываешь в слово "безопасны"?
По стандарту именно беззнаковое переполнение вроде бы как определено (т.е. НЕ является undefined behaviour)

Добавлено через 26 секунд
Ну и +1 к вопросу из поста #2
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
08.05.2017, 16:28  [ТС] #4
Что бы перебрать все значения:
C++
1
bitset<UINT_MAX> *BoolHash = new bitset<UINT_MAX>();
Добавлено через 47 минут
Я где то слышал (или читал), что для переполнения есть специальный регистр у процессора и если происходит оное, то устанавливается флаг, который можно прочитать и выполнить (в случае переполнения - обход ошибки)
0
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,354
Записей в блоге: 30
08.05.2017, 16:54 #5
Флаги переполнения есть в машине, в языке это никак не учитывается. Т.е. язык построен так, что если к беззнаковому +дофига прибавить единицу, то получится законный результат 0. При этом факт переполнения никак в языке не отражается, т.е. программист сам должен корячиться и по результату вычислять, было переполнение, или не было
2
Captain Maxee
08.05.2017, 17:03
  #6

Не по теме:

Evg, этот код считается валидным?

C
1
2
3
4
5
6
short shrt_max( void )
{
  short i = 0;
  while ( ++i > 0 );
  return --i;
}
Тут же как бы происходит переполнение, или нет?

0
Notoriously
69 / 69 / 24
Регистрация: 06.07.2016
Сообщений: 414
08.05.2017, 17:06 #7
Цитата Сообщение от eXPonent Посмотреть сообщение
Переполнения безопастны?
Конечно.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cmath>
 
int main()
{
  size_t variable = static_cast <size_t> (pow(2,sizeof(size_t) * 8) - 1);
  std :: cout << variable << std :: endl;
  std :: cout << variable + 1 << std :: endl;
}
Особенно, если рядом есть успокоительное, чтобы потом не разбить что-нибудь, поняв, что все пошло крахом из-за вот такого переполнения.
0
Evg
08.05.2017, 17:08
  #8

Не по теме:

Цитата Сообщение от Captain Maxee Посмотреть сообщение
Evg, этот код считается валидным?
Нет, тут знаковый тип. На моей памяти определённым было только беззнаковое переполнение

0
Croessmah
Ушел
13782 / 8032 / 928
Регистрация: 27.09.2012
Сообщений: 19,798
Записей в блоге: 3
Завершенные тесты: 1
08.05.2017, 21:04 #9
У меня у одного возникает вопрос, зачем нужен битсет с таким количеством флагов?
0
nmcf
09.05.2017, 08:50
  #10

Не по теме:

Croessmah, у него всегда так.

0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
11.05.2017, 17:26  [ТС] #11
Цитата Сообщение от nmcf Посмотреть сообщение
А зачем так делать?
Цитата Сообщение от Evg Посмотреть сообщение
Ну и +1 к вопросу из поста #2
Цитата Сообщение от Croessmah Посмотреть сообщение
У меня у одного возникает вопрос, зачем нужен битсет с таким количеством флагов?
Кому интересно сама программа с исходниками находится тут:
Hash Function Efficiency v0.1 pre-Alpha (May 11th, 2017)
0
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,155
11.05.2017, 17:33 #12
Это просто какая-то вычурная запись цикла.
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
11.05.2017, 17:38  [ТС] #13
Цитата Сообщение от nmcf Посмотреть сообщение
Это просто какая-то вычурная запись цикла.
А как нужно? так:
C++
1
for(unsigned int b(0); b != UINT_MAX; ++b)
0
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,155
11.05.2017, 17:46 #14
Да.
0
11.05.2017, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2017, 17:46
Привет! Вот еще темы с ответами:

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

Избавиться от переполнения буфера (asm) - C++
Всем привет, на вашем форуме первый раз) Имея базовые знания по C++ и Assembler решил сварганить такую штуку: // test.cpp: определяет...

39+ (-39) будет ли установлен флаг переполнения? - C++
Если выполнить в ячейке 1 байт двоичное сложение чисел 39 и -39 то это приведет к появлению единицы в 9-м разряде за пределом байта, а в...

Отлов исключения переполнения буфера - C++
Вот код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include &lt;exception&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru