|
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
|
|||||||||||
Уточнение работы теста для контейнера list стандартной библиотеки16.03.2020, 01:59. Показов 1499. Ответов 9
Метки нет (Все метки)
Доброго времени суток уважаемые форумчане. Прошу помочь мне ответить на интересующий меня вопрос. Для начала входная информация. Ниже представлен код теста под названием "Dev08_576265_list_remove" из пакета исходников стандартной библиотеки в реализации Майкрософт.
На всякий случай приведу код метода remove():
Теперь собственно вопрос. Что ожидали получить разработчики в случае неудачного завершения теста? Единственный видимый вариант - это вылет ассерта в перегруженном операторе. Но по какой причине должен вылететь этот ассерт?
0
|
|||||||||||
| 16.03.2020, 01:59 | |
|
Ответы с готовыми решениями:
9
На базе контейнера vector из стандартной библиотеки С++ создайте шаблон класса Set, Изучение функция стандартной библиотеки для новичка
|
|
Вездепух
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
||
| 16.03.2020, 04:52 | ||
canary) деструктор записывает значение 0xDEADBEEF. Если кто-то по ошибке попробует работать с памятью удаленного элемента, как с "живым" элементом, он будет видеть 0xDEADBEEF в поле canary.У "живых" элементов поле canary хранится 0x600DF00D. Если по какой-то причине "убитый" элемент попадет в оператор ==, сработает assert.
0
|
||
|
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
|
||
| 16.03.2020, 04:59 [ТС] | ||
|
0
|
||
|
Вездепух
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
||
| 16.03.2020, 05:05 | ||
|
1
|
||
|
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
|
||
| 16.03.2020, 05:39 [ТС] | ||
|
Вот это меня смущает. По идее тест должен быть надежным. А тут получается, что объект был удален. Мы внутри assert обращаемся к его полю canary, которое в деструкторе приобрело значение 0xDEADBEEF. Но память-то уже свободна. Кто мешает к моменту проверки внутри assert в это самое место положить 0x600DF00D (пусть вероятность мала, но все же).
Добавлено через 19 минут
0
|
||
|
Вездепух
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
|||
| 16.03.2020, 07:11 | |||
|
Память может либо освободиться "по настоящему", т.е. вернуться ОС, в каковом включатся механизмы предотвращения доступа к освобожденной памяти уровня ОС и при ошибочном доступе программа просто упадет. Либо память останется во владении приложения, в каком при ошибочном доступе случае сработает данный трюк с канарейкой. И так и так авторы теста достигают желаемого эффекта. Именно такими методами испокон веков и реализовались механизмы санитизации доступа к памяти. Все так делают. Именно так это и делается.
0
|
|||
|
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
|
||
| 16.03.2020, 14:14 [ТС] | ||
|
0
|
||
|
Вездепух
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
||
| 16.03.2020, 18:27 | ||
Сообщение было отмечено DrOffset как решение
РешениеКак я уже говорил выше, подход совершенно не удивительный, а общеизвестный и широко используемый повсеместно. Организация no-mans-land ("контрольно-следовых полос") областей в коде вокруг объектов, заполнение освобожденных блоков памяти "посторонним" значением, и даже "ненужное" обнуление указателей в деструкторах объектов - это все вариации этого же самого подхода. Это настолько просто, удобно, эффективно и универсально, что непонятно, зачем придумывать что-то еще ("без хаков"). P.S. И, еще раз, "хаки" тут есть только с точки зрения внешнего "пользователя" языка С++, который подчиняется требованиям стандарта языка. Но этот код - это код уровня реализации стандартной библиотеки. Это формально вообще не С++, а некий платформенно-зависимый псевдоязык, на котором написана стандартная библиотека. В рамках этого языка никакого "хака" тут нет.
1
|
||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||
| 16.03.2020, 19:45 | |||||||
|
Гарантии работоспособности предоставляют тесты. В тестировании есть такое понятие: "презумпция невиновности" Суть: функция foo доверяет функции bar, при условии, что все тесты bar зеленые. Что бы получить гарантии правильного срабатывния assert, нужно два теста: 1) Тест, где мы точно знаем, что assert должен сработать 2) Тест, где мы точно знаем, что assert не должен сработать. Если оба теста зеленые, значит всё хорошо. Пример: Функция strlen принимает указатель на строку, и возвращает длину этой строки. Если на вход подать невалидный аргумент, тогда должен сработать ассерт.
Формально, с точки зрения языка с++, в некотором коде может присутствовать UB. Но что такое UB с точки зрения языка? Некоторые почему-то думают, что раз UB, то теперь может случиться всё, что угодно. Ничего подобного. "Неопределенное поведение" - это просто ситуация, для которой стандарт не предусматривает никаких гарантий. Однако, любое поведение в конечном счете зависит от конкретной реализации на конкретной платформе. И для этой конкретной реализации факт наличия UB уже ничего не меняет. Поведение на этой конкретной платформе не может внезапно измениться по волшебству. Пока оба теста зеленые, можно считать что на этой конкретной платформе ассерт работает как нужно. и до тех пор, пока явным образом не будет доказано обратное, для ассерта действует презумпция невиновности.
0
|
|||||||
|
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
|
||
| 16.03.2020, 20:28 [ТС] | ||
|
0
|
||
| 16.03.2020, 20:28 | |
|
Помогаю со студенческими работами здесь
10
Перегрузка оператора индексирования для контейнера list Функции стандартной библиотеки для отображения одной системы счисления в другую Какой препроцессор используется для подключения стандартной библиотеки ввода-вывода? Подскажите пожалуйста как использовать __gnu_parallel::for_each для контейнера <list> Какие библиотеки нужны для работы с видео avi, flv и для работы с mp3? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|