![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
код, представленный 8Observer8, является небезопасным (не корректным), поскольку не содержит защиты от переполнения буфера.
|
![]() |
![]() |
![]() |
#12 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Да не учёл, спасибо! Сейчас в коде как раз ситуация переполнения.
Код:
|
![]() |
![]() |
![]() |
#13 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
2 уровня безопасности:
- перед вхождением в функцию (отрезать лишьнее, либо сгенерить ошибку) - внутри функции (записать сколько можно, либо сгенерить ошибку) код косячный Последний раз редактировалось Stilet; 27.05.2012 в 10:34. |
![]() |
![]() |
![]() |
#14 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Чем он плох?
Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
![]()
Kaela
Обрати внимание на примеры от 8Observer8 - они крайне поучительны о том, как не надо писать программы... если, конечно, ты не хочешь быть уволенным за вредительство :lol: Код:
Вот так работает: ... в стране "That never happens" :lol: Код:
правильный вариант: Код:
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
![]() |
![]() |
![]() |
#16 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
А вызываемая сторона не должна рассчитывать на корректность вызывающей, и поэтому, должна проверить входящие данные. И так на всех этажах. Профит тут вот в чем: я запускаю игру в автоматическом режиме "невидимка". Игра полностью отыгрывается, как и положено. (причем она сама для себя на кнопки нажимает. Работает автоматика), только без графики. На экране ничего не видно. В таком режиме она может отыграть весь рабочий цикл игры за десятые/сотые/тысячные доли секунды. В режиме отладки я запускаю её играть 10 000 игр, и иду пить чай. Потом прихожу. Игра к этому моменту уже упала. по сути, система безопасности меня буквально ткнула носом в проблемную точку. Далее, я просто просматриваю стек вызовов, что бы понять и воссоздать ситуацию, при которой сработала защита. То есть, я вижу кто кого дергал, и у кого какие значения переменных были в тот момент. Там и не приходится особо далеко смотреть, что бы увидеть ту сущность, которая пропустила некорректные данные. И вот, я запускал 10 000 автоматических игр, а крушение произошло на на 3700 какой нибудь игре. Такая двойная защита на всех этажах привентивно гарантирует тебе, что ни одна мышь не проскочет. Если даже программный код на верхних этажах и пропустит мимо себя жука, то есть особый повод быть уверенным, что его перехватят на более нижних этажах. Итого: мы получаем способ обнаружения редко-проявляющихся ошибок. И экономим колоссальную кучу времени на отладке на всех этапах разработки продукта. |
|
![]() |
![]() |
![]() |
#17 | |
Форумчанин
Регистрация: 22.05.2012
Сообщений: 352
|
![]()
[QUOTE=Kaela;1050862]
Цитата:
Код:
|
|
![]() |
![]() |
![]() |
#18 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
[QUOTE=rlib;1051281]
Цитата:
В грамотной архитектуре тот, кто явно выделял память, тот должен явно и освобождать. Ты же процедуру выделения/удаления памяти размазываешь по всем участникам архитектурного сооружения, и вводишь путаницу: нефига не очевидно, кто должен следить за утечками памяти. Но что бы взаимодействовать, у тебя все участники должны учитывать особенности друг друга. Этот анти-паттерн называют ещё "спаггети-код". Вместо этого, можно сделать перегрузку функций, и единообразно принимать на входе вариантно или: 1. std::string переменную. 2. Массив чаров. 3. Указатель на чар, и размер буфера. Компилятор без труда разберётся какую конкретно функцию нужно будет запустить для конкретного аргумента. В первых двух случаях контроль за временем жизни строки сводится к ничего не деланью. В последнем случае, если вызывающая сторона явно выделяла память - она же её и будет удалять. Но выделять память на куче вовсе не обязательно. С тем же успехом можно скормить и массив на стеке, + его размер. Сама функция только загружает данные в переданный буфер, и больше ничего не делает. |
|
![]() |
![]() |
![]() |
#19 | |
Форумчанин
Регистрация: 22.05.2012
Сообщений: 352
|
![]()
[QUOTE=_Bers;1051297]
Цитата:
В любой ADT (Abstract Data Type) на C, функция create()_ создает динамический обьект и возвращает хендл user-у, котрый САМ обязан освободить этот обьект. Наверно, самым лучшим примером будет весь WinAPI. Перекладывание обязанности следить за выделяемыми обьэктами юзеру - это вообще дело соглашения. Точно также, как, например, в ассемблере у тебя есть вызов процедуры методом STDCALL или методом PASCAL. В первом случае, вызывающая функция балансирует стэк сама; во втором - функция, которая вызывается. Последний раз редактировалось rlib; 27.05.2012 в 16:34. |
|
![]() |
![]() |
![]() |
#20 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Вспомним задание:
Цитата:
Мой вариант решения: это передавать в функцию указатель на буфер фиксированной длины и размер буфера. Функция getstr читает не более чем "размер буфера" (BSIZE-1). Остальное обрезается./ Код:
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Возврат массива из функции | max_prorok | Помощь студентам | 2 | 06.10.2011 12:39 |
Возврат 2 и более аргументов из функции. | Drilla | Microsoft Office Excel | 2 | 18.09.2011 14:11 |
c++ возврат указателя из функции | Neolit1819 | Помощь студентам | 6 | 28.03.2011 15:37 |
Мини бэйсик:объявление функции, вызов функции , возврат. | AL_LORD | Помощь студентам | 2 | 14.10.2010 17:48 |
Возврат результата функции по ссылке | gladov | Общие вопросы C/C++ | 2 | 24.06.2008 22:48 |