Что будет если выйти за пределы массива повредить данные а потом восстановить?04.02.2021, 23:17. Показов 4209. Ответов 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. Какое число будет присвоено? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|