SII писал(а):
В RSX-11 с этим, возможно, несколько получше. Во-первых, все права делятся на четыре категории: 1) владелец; 2) член группы, в которую входит владелец, но который сам не является владельцем; 3) привилегированный пользователь (администратор); 4) все остальные пользователи. Во-вторых, самих прав тоже не 3, а 4: 1) чтение, 2) запись, 3) запуск/управление/ещё-там-что-нибудь (в зависимости от вида защищаемого объекта -- защита распространяется не только на файлы); 4) удаление. Соответственно, маска защиты объекта занимает одно слово (16 бит).
Система безопасности RSX-11, как и Линукс (без ACL) обладает тем принципиальным ограничением, что не различается членство в разных группах. Т.е. предполагается, что че-к - участник только одной группы. Очень глупо и недальновидно.
В системе безопасности Windows мне не нравится то, что для каждого объекта права прописываются индивидуально. Т.е. появился в папке файл, - для него индивидуально прописываются унаследованные права. При перемещении файла в другое место он потащит за собой старые права, вместо того, чтобы наследовать права нового размещения. Это просто ужасно! Если я переношу кусок дерева файловой системы с тысячей файлов в новое место, причём для этих файлов я не назначал прав доступа, то я обнаружу, что на новом месте у них не появились права доступа, связанные с новым размещением! Более того, сохранились старые права! Иными словами, чтобы передать файл от пользователя А пользователю Б мне совершенно недостаточно переместить файл из папки А в папку Б. Мне надо открыть свойства файла и применить к нему наследованные права. В случае тысяч файлов в куче папок это превращается превратиться в головную боль и потенциальную брешь в доступе. В системах с NTFS я для решения этой проблемы обычно держу дополнительный раздел FAT32 и переношу файлы в две стадии - сначала со старого места в раздел FAT, для аннулирования старых прав, затем в новое место в NTFS, где они наследуют новые права. Блин, поубивал бы разработчиков!
Повторюсь, - более грамотной и удобной системы прав доступа, чем в Novell Netware, не встречал. Каждый, кто планирует разделение прав доступа, просто должен поставить эту систему и покатать её на практике.
В ней права доступа задаются явно на объекты - директории и индивидуальные файлы. Наследованные права не хранятся индивидуально у каждого объекта, а вычисляются по факту текущего положения объекта в общей йерархии. Сменилось положение - автоматически меняются права.
Субъектами прав являются пользователи и группы. У каждой группы есть менеджеры, которые в рамках прав, отпущенных им вышестоящим субъектом могут назначать права доступа для своей группы в подконтрольной им зоне. Подконтрольность определяется их собственными правами, т.к. они сами могут быть членами каких-то групп или иметь персонально назначенные права. Персональные назначения прав (для пользователя) имеют приоритет перед групповыми. Вершиной всего дерева прав является, естественно, администратор. В рамках данной системы очень просто реализуется произвольный масштаб организации прав доступа. Так, админ, выделяет несколько папок, создаёт основные группы и может назначить для них менеджеров с правом доступа в соответствующие папки. Менеджер может самостоятельно набирать членов своей группы, создавать в рамках своих полномочий дополнительное разделение прав, новые группы пользователей и назначать менеджеров следующего уровня. И т.д. При этом ни один нижестоящий уровень не может перебить права, назначенные вышестоящим.
SII писал(а):
... и это даже в том случае, если кодировщик не злоупотребляет вольностями сишного синтаксиса (что там можно накодить при желании, мы все знаем).
Вот вы критикуете предложения об ограничении области обработки исключений, как слишком жёсткие, а вместе с тем критикуете С за вольность. Я думаю, что инструмент хорош возможностями, которые предоставляет, а программист хорош тем, как он использует эти возможности. Синтаксис языка плох тогда, когда он
провоцирует программиста на использование плохих решений. Так, можно структурно программировать на фортране или на бейсике, но сами языки к этому не располагают. Если в си написать конструкцию *a++ = *b++, то она страшна с только непривычки. На самом деле с языковой практикой воспринимать такую конструкцию оказывается проще, чем три разных последовательных оператора.
SII писал(а):
Сюда же относятся и { } вместо begin-end: вторые однозначно длиннее, но на глаз вылавливаются из текста быстрей и проще. И дело здесь не в привычке...
Это ОЧЕНЬ субъективно. По мне, так ровно наоборот.
По остальным моментам - я не спорю, что С/С++ во многом плохи. Но и идеального языка я пока не вижу.
SII писал(а):
Что же касается необходимости объявления нового типа исключения, то от него, вообще говоря, никак не избавиться ... В Аде лучше: там объявляется нечто вроде MyExpt : exception -- и всё. Что скрывается за этим exception, знает только компилятор (в Аде это не название типа, как в Дельфях, а зарезервированное слово, имеющее для компилятора строго определённый смысл).
Вот, адский подход - вполне достойная альтернатива. Значит всё-таки можно :)
SII писал(а):
ИМХО, это было бы ненужным ограничением. Иногда действительно надо заключить в такой блок лишь некоторую часть подпрограммы, так зачем это запрещать?
Так можно сделать это нестрогим ограничением. Например, хочешь обработку исключения только в этом участке кода - выдели его в отдельный логический блок. {} или begin/end, кому как удобней, и в нём назначь перехват исключений. Я к тому, чтобы синтаксис язык не
провоцировал программиста на неправильное использование.