Что будет если выйти за пределы массива повредить данные а потом восстановить?04.02.2021, 23:17. Показов 4025. Ответов 39
Метки нет (Все метки)
Мне интересно каковы будут последствия как с динамической памятью так и со статической. Рассматриваются варианты если 2 программы полезут в одно адресное пространство, возможно ли это в моём случае я не знаю, поэтому спрашиваю.
1.Пример со стат. памятью. Есть массив char mas[100] у меня возникает спорная ситуация и мне приходится записать информацию в 100-103 байты. Я конечно понимаю что выхожу за пределы массива, поэтому я заранее сохраняю информацию которая хранилась в диапазоне 100-103 и позже записываю её назад. Рассматриваемые варианты. а) Если доступ к статической памяти синхронный/последовательный ничего не произойдёт. Процессор будет ждать пока освободится первый поток, а в 1ом потоке есть задача записать байты назад и лишь затем полезет в область данных 100-103. б) В конце каждого массива лежит байтслово, т.е. дополнительные 4 байта или sizeof(char*)(каков там будет размер зависит от того сколько памяти занимает указатель), в этом случае у нас есть дополнительные байты которые будут отделять 2ой поток от 1го, 2ой поток в этом случае возьмёт своё начало на 104 байте. Но опять же учитывая то что Майкрософт использует байтслова, повреждение байтслова может вызвать ошибку и 2ой поток может неправильно взять память под себя. Опять же доказательств всему этому нет. В целом по этому пункту считаю что ничего не произойдёт.в) Возможно если мы повредим байтслово, которое находится в диапазоне 100-103, то может возникнуть утечка памяти на 4 байта или sizeof(char*). Далее когда поток 1 завершится байтслово будет записано назад и в конечном итоге память восстановится. По этому пункту считаю что ничего не произойдёт.г) Вариант с описателем. Т.к. статические массивы имеют описатель то поток 2 тупо захватит новый участок памяти на 104 байте, его вообще не будет интересовать что происходит в диапазоне 100-103. По этому пункту считаю что ничего не произойдёт. д) Если функции имеют разный стэк а это так, потому что они разные но используют одну память, в этом случае поток 2 не достанет до потока 1, т.е. снижается вероятность что они пересекутся. В этом случае ничего не произойдёт. е) Поток 2 будет обрезать поток 1ин если тот выходит за пределы массива. Звучит не очень надёжно. 2. По динамической памяти примерно те же варианты, с единственной оговоркой- есть возможность управлять критическими секциями, в этом случае можно защитить критические байты или проигнорировать происходящее.
0
|
|
| 04.02.2021, 23:17 | |
|
Ответы с готовыми решениями:
39
Нужно найти такой самый первый элемент массива, что если его умножить на (−1) сумма всего массива будет равна нулю Подскажите пожалуйста если что нибудь наподобе break но что бы не из функции выйти а полностью из программы |
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 05.02.2021, 02:22 | |||
|
Что практически даст вам выходить за пределы массива ? Зачем все это ? Если хотите чего то добиться, играть нужно по правилам. Если хотите владеть хорошо ЯП, возможностями уже готовых конструкций - их нужно знать. И опять же - играть по их правилам. Все эти непонятные заморочки, в результате получите целую кучу ненужной работы. что бы избавить себя от передачи таких массивов, от привязки к ним размера и т.д. Я честно ничего не понял.
0
|
|||
|
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
|
||
| 05.02.2021, 02:24 | ||
|
Там кстати умная вещь написана. За границей массива может лежать данные переменной, которая будет использована в текущий момент. А ТС просто возьмёт и перезапишет данные,и данные переменной уже не будут указывать на нужные данные.
0
|
||
| 05.02.2021, 03:56 [ТС] | ||
|
Добавлено через 6 минут В целом пользователь считает что может накрыться другая программа, видимо очень опасно.
0
|
||
|
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
|
|
| 05.02.2021, 04:03 | |
|
0
|
|
|
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
|
||
| 05.02.2021, 05:04 | ||
|
А вообще тебе уже порекомендовали использовать std::array
0
|
||
|
Модератор
|
|
| 05.02.2021, 06:29 | |
|
Nexi99, если Вы хотите обрабатывать массив бОльшими блоками "с запасом", то и определяйте массив с запасом, например, кратным 16 байт.
Единственное, что программа имеет право делать за пределами char mas[100], это &mas[100]. Современные стандарты требуют, чтобы при такой операции фактически не происходило обращение к mas[100] ( *(mas+100) ).То, что фактически происходит при доступе потоков к соседним в памяти объектам - забота разработчиков ЭВМ, ОС и компилятора. Они должны позаботится о том, чтобы корректно написанная программа работала корректно.
0
|
|
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||
| 05.02.2021, 21:15 | |||
|
Вот если вы вдруг не поняли - так написано в правилах языка. При чем тут какие то крайности? На практике такой выход за пределы диапазона в лучшем случае приведет к крашу. На случай, если вы друг не поняли, я ещё раз подчеркну мысль: Гибель процесса - это лучшее, что вас ждет. Возможная альтернатива намного хуже. В худшем случае, можно незаметно испортить память, и потом долго-долго удивляться странным глюкам. Диагностировать и искать потом такие баги можно будет очень долго и сложно. Специально для вас: совершенно не важно, что именно находится за границами массива. Сам факт выхода за границы массива уже делает всё дальнейшее поведение программы не определенным. Вот это - просто запредельно идиотское решение: Что мешает изначально создать те же самые 103 элемента? Или 200 элементов? Или сколько вам там ещё нужно с вашими "спорными ситуациями" Получите ту же самую возможность дописать что либо в хвост массива, но без вот этих приседаний с вылетом за диапазон массива. Вот зачем вы сами себе на ровном месте без какой либо причины усложняете жизнь? Ваш код содержит просто ужасное по своей сути UB. Сбой может произойти в любой момент в зависимости от фазы луны, или левой пятки компилятора.
0
|
|||
|
"C with Classes"
|
|
| 05.02.2021, 21:40 | |
|
Nexi99, короче тебе хотят тут сказать, что в чужую память лазить нельзя. но если тебе вдруг приспичило, то нужно много всего изучить, в основном как работает операционная система. за один день, даже за один год это изучить не получиться. и это уже выходит за рамки программирование на C++ и начинается хакерство, потому что придется обходить защиту операционной системы "защиту памяти процесса".
0
|
|
| 05.02.2021, 22:09 [ТС] | ||
|
Добавлено через 59 секунд Знать бы точно блокируется или нет какой туда доступ синхронный или свободный насколько риск силён Добавлено через 1 минуту В динамической памяти можно создать критическую секцию заблокировать участок и 2ой поток туда не залезет
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 05.02.2021, 22:11 | |
|
0
|
|
| 05.02.2021, 23:13 [ТС] | |||||||
|
Добавлено через 1 минуту Даже если стэк у другой функции будет дальше то уже этот участок можно трогать. Добавлено через 2 минуты Вот пример
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 05.02.2021, 23:21 | ||
|
А при отсутствии синхронизации имеет право отложить шаг "сразу же восстанавливаем" до морковкина заговенья. Компилятор должен сохранять лишь наблюдаемое поведение программы, к которому запись данных в память обычно не относится. А существование других потоков между точками синхронизации не учитывается.
0
|
||
|
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
|
||
| 05.02.2021, 23:29 | ||
|
Если ты хочешь место под буфер, но ты не знаешь сколько нужно длины для буфера. То есть функции которые могут рассчитать нужную длину для всяких принтов и так далее.
0
|
||
| 05.02.2021, 23:36 [ТС] | |||
|
0
|
|||
|
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
|
||
| 06.02.2021, 00:17 | ||
|
0
|
||
| 06.02.2021, 00:35 [ТС] | ||
|
0
|
||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
||
| 06.02.2021, 04:11 | ||
&mas[100] эквивалентен &*(mas + 100) и в C++, в отличие от C, соседние &* не отменяют вычисление друг друга, так что *(mas + 100) вычисляется.Оператор * в C++ требует указателя на объект, а mas + 100 на объект не указывает.
0
|
||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||||||||
| 06.02.2021, 05:41 | |||||||||||||
|
(За исключением end. Об этом ниже) То есть, вот такой код уже содержит UB:
Но при этом через него ничего не делается: ни чтения, ни записи. И тем не менее, код уже содержит UB. Для поддержки работы итераторов допускается указатель end, который указывает за последний элемент массива. Но и только лишь. Его нельзя будет ещё раз инкрементировать:
0
|
|||||||||||||
| 06.02.2021, 05:41 | |
|
Что будет с солнечными лучами, которые попадают в сферу и выйти не смогут?
Что будет, если установленная ОЗУ будет от разных производителей? Что будет выводить puts, если в конце строки не будет нулевого байта Что будет если к пустой строке применить strtoint. Какое число будет присвоено? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|