![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| alex7851 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Приветствую уважаемую публику.
Возник спор по поводу того, что говорится в последнем стандарте C++ про выход индекса массива за декларированные пределы. Насколько я помню, такой выход допустим (вернее, по стандарту, компилятор не обязан это проверять). Прошу знатоков ткнуть носом, где про это прямо сказано, либо сказать, что такое разрешено, потому что не запрещено стандартом. Просто мои аргументы в споре иссякли. =) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в случае автоматического массива - получите segfolt/access_violation/порчу чужой памяти. в случае с динамическим массивом - получите segfolt/access_violation/порчу чужой памяти. в случае с вектором - получите segfolt/access_violation/порчу чужой памяти. в случае с std::array - получите segfolt/access_violation/порчу чужой памяти. Добавлено через 2 минуты и 49 секунд подкорректировал. Добавлено через 3 минуты и 57 секунд в стандарте. лень искать Это сообщение отредактировал(а) boostcoder - 5.2.2012, 20:44 |
|||
|
||||
| alex7851 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Спасибо, то, что можно повредить память, очевидно.
Тогда подтвердите, пожалуйста, следующее (если верно По стандарту языка, выход за пределы не должен проверяться. Поэтому компиляторы, соответветствующие стандарту, этого не проверяют. Это приводит к тому, что такой код всегда скомпилируется и, если и произойдет ошибка, то только выполнения. Другими словами, можно сказать, что проверка выхода индекса за допустимые пределы не предусмотрена языком C++. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
угу.
ага. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
А компилятор просто не может этого проверить. Выход за пределы может быть проверен, в общем случае, только в ран-тайме. Ну а покуда С/С++ нацелен на максимальное быстродействие, никакой проверки, по-умолчанию нет. В С++ вообще ничего нет, что не заказывали явно, тем более нагружающее ран-тайм. Нужна проверка организуйте сами. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для честности нужно упомянуть еще и std::vector::at() |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, как бы да. но это ведь не индекс, и не оператор индекса.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В стандарте это скорее всего будет задеклалрированно как Undefined Behavior (IMHO). Т.е. компилятор имеет право сделать все, что ему заблагорассудится. В том числе может и проверять, а может и не проверять. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Очень может быть, что в режиме отладки он проверяет, а в релизе нет.
|
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
в режиме отладки это дебагер, а компилятор такой фигней не страдает.. -------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
-------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
с каких пор компиляцей в режиме отладки занимается дебагер ? |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
а что такое проверяет в режиме отладки? кто про компиляцию хоть слово сказал? и как быть с индексным переполнением? как это мог бы проверить компилятор? чисто теоретически, если предположить, что существует такой компилятор, который это делает.. -------------------- undefined |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |