OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Критика строк в стиле Си на Хабре
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 10:35 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
https://habrahabr.ru/post/126566/
Статья старая, может кто-то и читал. Но поскольку, строки в стиле Си ещё похоже долго будут использоваться -- статья не потеряет актуальности ещё долго))

Как-то я не задумывался над тем, что с длиной строки, обработку такой строки можно аппаратно ускорить. Кроме вопроса безопасности))

http://russian.joelonsoftware.com/Artic ... asics.html
Ещё одна статья про сложности строк в Си.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 11:08 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
В Обероне тоже есть строки, которые заканчиваются нулём.
Код:
PROCEDURE Proc();
VAR str: ARRAY 100 OF CHAR;
BEGIN
  str := "Hello";
END Proc;

Допустить, мы будем хранить рядом со строкой еще одно число, где хранится длина текущей строки чтобы в дальнейшем можно было быстрее конкатенировать строки и так далее.
В данном случае, со словом Hello, у нас длина будет 5 символов.
Но что если в дальнейшем будет обращение к элементу массива str[1] := 0X; ?
Получается, что каждое присваивание элементу массива должно проверяться на то, что нет ли там нулевой строки и не уменьшилась ли строка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 11:43 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Вопрос решается легко.
1. Ноль -- обозначает конец строки (хотя сам массив может быть гораздо длиннее).
2. В строке (буквально) хранить её длину первым числом -- неразумно.
Сделать примерно так:
Код:
TYPE
    tString: REACORD
        len:INTEGER;
        str:ARRAY 100 OF CHAR;
    END;
VAR
    str : tString
BEGIN
........

И все проблемы решены. И с оптимизированным присвоением, и копированием, и конкатенацией, и чтением/записью.
Определяем тип в модуле без возможности расширения и получаем гарантированно работающий безопасный код)
Ноль в конце строки в данном случае совсем не нужен. Будет сохраняться как рудимент.

Во второй статье отличный анекдот про маляра Шлемиэля. Это про проблемы конкатенации в Си)) Не в бровь, а в глаз)) И инетерсные подробности работы malloc. Это практически недоделанный сборщик мусора!!!)))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 17:13 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Rifat писал(а):
Но что если в дальнейшем будет обращение к элементу массива str[1] := 0X; ?
Заменять все коды без графического обозначения на пробел или другой, специальный символ из имеющихся в кодовой таблице.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 19:36 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Valery Solovey писал(а):
Заменять все коды без графического обозначения на пробел
Существует обширная практика хранения BLOB в строках. На самом деле удобно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 20:43 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Уточню, что заменять надо при выводе на экран, а не при записи элемента в массив. Массив будет продолжать содержать непечатный символ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 20:44 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Alexey_Donskoy писал(а):
Существует обширная практика хранения BLOB в строках. На самом деле удобно.
Это удобнее, чем обычный массив байт?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 20:59 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Valery Solovey писал(а):
Это удобнее, чем обычный массив байт?
Зачастую да. Например, в Дельфе в TStringList укладывать.
Но, может, это только моя специфика, сейчас особо не с чем сравнивать...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Сентябрь, 2016 21:22 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Сентябрь, 2016 09:33 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Борис Рюмшин писал(а):
У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.

У сишников проблема в самом построении языка))
Статью вчера прочитал: "протечка абстракций".
Вот 146% про Си. И эти сквозные протечки -- неустранимы. С++ -- попытка устранить. Кривая))
Я не вижу протечку в Оберонах. Если, конечно, специально в потроха не лезть))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Октябрь, 2016 19:00 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Борис Рюмшин писал(а):
У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.

В 0 тоже есть проблема. Когда содержимое строки получают извне, многие забывают проверить, чтобы в содержимом не было 0, так как в этом случае длина строки окажется короче ожидаемой. Такие особенности остро встают при работе над безопасностью приложения. Неправильного поведения программы можно добиться и без порчи памяти.
К слову, если бы проблема была только в отсутствии контроля границ, то её бы и не было вовсе, потому что современные компиляторы Си умеют их контролировать. Для получения такого контроля нужно использовать ключ -fsanitize=address , поддерживаемый и gcc, и clang. По моим наблюдениям для gcc программа замедляется раза в 3, но при включённой оптимизации всё равно работает быстрей эквивалентной программы на Blackbox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Октябрь, 2016 19:28 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Это немножко из другой оперы.
Это про взаимодействие двух систем, поэтому здесь работает заповедь дедушки Вирта:"Вся программа должна строиться в оборонительном стиле". Поэтому при подобной ситуации программа на О может остановиться, но не упасть или улететь в космос. Это огромная разница.
Внутри правильных Оберонов подобная ситуация невозможна. Что касается быстродействия, тут опять же: я предпочту неубиваемый "Москвич" с предельной скоростью 120, чем смешной "Феррари", который развалится через 500 км на скорости 340 км в час. На практике проблема вычислительной мощности в 67% случаев перерастает в проблему ввода-вывода. Например, отрисовка на экране)))
Кроме того, включение такой опции безопасности в GCC говорит о том, что проблема не высосана из пальца. И эта опция неполноценна, так как это попытка заштукатурить кривой фундамент.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Октябрь, 2016 20:14 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Я отвечал не вообще, а конкретно на утверждение. Никто не убеждает, что нужно использовать Си, но:
1. Контроль за памятью в Си есть.
2. Проблема с завершающим нулём есть и при наличи контроля за памятью.
Остальное - лирика.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Октябрь, 2016 21:12 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
prospero78 писал(а):
заповедь дедушки Вирта:"Вся программа должна строиться в оборонительном стиле".
В "оберонительном".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 09:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
По моим наблюдениям для gcc программа замедляется раза в 3, но при включённой оптимизации всё равно работает быстрей эквивалентной программы на Blackbox.

Тут нужно отметить, у ББ вообще старый компилятор, медленный код не из-за только лишь границ массива (ну, желающие могут выключить контроль границ и проверить).
Хотя, очевидно, что это зависит от алгоритма, который меряем.
Реально, думаю, замедление должно быть из-за контроля границ на 5-20% (от алгоритма, опять же).
Именно такая цифра, по-моему, будет при сравнении C# и C++ на массивовых алгоритмах.
В С же требуется контролировать не просто массивы, а адресную арифметику, поэтому, конечно, замедление колоссальное - и используют его только в отладочном режиме, по сути.


Последний раз редактировалось Илья Ермаков Четверг, 20 Октябрь, 2016 09:28, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 09:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Я отвечал не вообще, а конкретно на утверждение. Никто не убеждает, что нужно использовать Си, но:
1. Контроль за памятью в Си есть.
2. Проблема с завершающим нулём есть и при наличи контроля за памятью.
Остальное - лирика.


Не, ну по большому счёту, что-то где-то всегда, можно сказать, есть, в каком-нибудь виде, если сову брать эластичную... :)

В release-сборках большинства приложений контроль за памятью деактивирован.
Если я не прав, просьба привести несколько противоположных примеров.
Таким образом.... хоть контроль за памятью в Си есть... контроля за памятью в Си-приложениях, как правило, нет...
Остальное - лирика :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 14:32 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Примеры есть, "но мы вам о них не расскажем" (С). Это не прихоть.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 17:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну, значит, речь о специфических, а не массовых, кейсах, верно?
А массовая статистика последствий от выхода за границы - убийственна, как известно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 19:13 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Хм...
1. Проверки используются...
2. Сборщик мусора используется....
Мы всё ещё говорим о Си?))))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Октябрь, 2016 19:35 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Консервативный сборщик там у них есть... Т.е. всякое значение, потенциально могущее указывать на объект кучи, трактуется как якорь (как в ББ для стека).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB