Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стандарт Cpp: выход индекса массива за пределы, вопрос по стандарту языка 
:(
    Опции темы
alex7851
Дата 5.2.2012, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.2.2012

Репутация: нет
Всего: нет



Приветствую уважаемую публику.
Возник спор по поводу того, что говорится в последнем стандарте C++ про выход индекса массива за декларированные пределы. Насколько я помню, такой выход допустим (вернее, по стандарту, компилятор не обязан это проверять). Прошу знатоков ткнуть носом, где про это прямо сказано, либо сказать, что такое разрешено, потому что не запрещено стандартом.
Просто мои аргументы в споре иссякли. =)
PM MAIL   Вверх
boostcoder
Дата 5.2.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(alex7851 @  5.2.2012,  20:24 Найти цитируемый пост)
про выход индекса массива

в случае автоматического массива - получите segfolt/access_violation/порчу чужой памяти.
в случае с динамическим массивом - получите segfolt/access_violation/порчу чужой памяти.
в случае с вектором - получите segfolt/access_violation/порчу чужой памяти.
в случае с std::array - получите segfolt/access_violation/порчу чужой памяти.

Добавлено через 2 минуты и 49 секунд
подкорректировал.

Добавлено через 3 минуты и 57 секунд
Цитата(alex7851 @  5.2.2012,  20:24 Найти цитируемый пост)
ткнуть носом, где про это прямо сказано

в стандарте. лень искать smile

Это сообщение отредактировал(а) boostcoder - 5.2.2012, 20:44
PM WWW   Вверх
alex7851
Дата 5.2.2012, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.2.2012

Репутация: нет
Всего: нет



Спасибо, то, что можно повредить память, очевидно.

Тогда подтвердите, пожалуйста, следующее (если верно smile ):
По стандарту языка, выход за пределы не должен проверяться. Поэтому компиляторы, соответветствующие стандарту, этого не проверяют. Это приводит к тому, что такой код всегда скомпилируется и, если и произойдет ошибка, то только выполнения. Другими словами, можно сказать, что проверка выхода индекса за допустимые пределы не предусмотрена языком C++.
PM MAIL   Вверх
boostcoder
Дата 5.2.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(alex7851 @  5.2.2012,  20:57 Найти цитируемый пост)
По стандарту языка, выход за пределы не должен проверяться. Поэтому компиляторы, соответветствующие стандарту, этого не проверяют. Это приводит к тому, что такой код всегда скомпилируется и, если и произойдет ошибка, то только выполнения.

угу.

Цитата(alex7851 @  5.2.2012,  20:57 Найти цитируемый пост)
Другими словами, можно сказать, что проверка выхода индекса за допустимые пределы не предусмотрена языком C++.

ага.

PM WWW   Вверх
volatile
Дата 6.2.2012, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(alex7851 @  5.2.2012,  20:57 Найти цитируемый пост)
Поэтому компиляторы, соответветствующие стандарту, этого не проверяют. 

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

PM MAIL   Вверх
mes
Дата 6.2.2012, 01:49 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.2.2012,  19:41 Найти цитируемый пост)
в случае с вектором -

для честности нужно упомянуть еще и std::vector::at()




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 6.2.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, как бы да. но это ведь не индекс, и не оператор индекса.
PM WWW   Вверх
mes
Дата 6.2.2012, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  6.2.2012,  08:39 Найти цитируемый пост)
как бы да. но это ведь не индекс, и не оператор индекса

Цитата


public member function
      reference operator[] ( size_type n );
const_reference operator[] ( size_type n ) const;
Access element

Returns a reference to the element at position n in the vector container.

A similar member function, vector::at, has the same behavior as this operator function, except that vector::at signals if the requested position is out of range by throwing an exception.

 smile 


--------------------
PM MAIL WWW   Вверх
xvr
Дата 6.2.2012, 13:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(alex7851 @  5.2.2012,  20:57 Найти цитируемый пост)
 Другими словами, можно сказать, что проверка выхода индекса за допустимые пределы не предусмотрена языком C++. 

В стандарте это скорее всего будет задеклалрированно как Undefined Behavior (IMHO). Т.е. компилятор имеет право сделать все, что ему заблагорассудится. В том числе может и проверять, а может и не проверять.

PM MAIL   Вверх
bsa
Дата 6.2.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Очень может быть, что в режиме отладки он проверяет, а в релизе нет.
PM   Вверх
fish9370
Дата 6.2.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(bsa @  6.2.2012,  15:13 Найти цитируемый пост)
Очень может быть, что в режиме отладки он проверяет, а в релизе нет.


в режиме отладки это дебагер, а компилятор такой фигней не страдает..  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
mes
Дата 6.2.2012, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(fish9370 @  6.2.2012,  18:39 Найти цитируемый пост)
в режиме отладки это дебагер, а компилятор такой фигней не страдает..  

чиго ? smile 

Это сообщение отредактировал(а) mes - 6.2.2012, 20:33


--------------------
PM MAIL WWW   Вверх
fish9370
Дата 6.2.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(mes @  6.2.2012,  20:33 Найти цитируемый пост)
чиго ?


что чиго?  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
mes
Дата 6.2.2012, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(fish9370 @  6.2.2012,  20:21 Найти цитируемый пост)
что чиго? 

с каких пор компиляцей в режиме отладки занимается дебагер ?


--------------------
PM MAIL WWW   Вверх
fish9370
Дата 6.2.2012, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(mes @  6.2.2012,  22:05 Найти цитируемый пост)
с каких пор компиляцей в режиме отладки занимается дебагер ?


Цитата(bsa @  6.2.2012,  15:13 Найти цитируемый пост)
Очень может быть, что в режиме отладки он проверяет, а в релизе нет.


а что такое проверяет в режиме отладки? 
кто про компиляцию хоть слово сказал?

и как быть с индексным переполнением? как это мог бы проверить компилятор? чисто теоретически, если предположить, что существует такой компилятор, который это делает..  smile 



--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.