- 1
- 2
- 3
- 4
- 5
char* _getvalue(....)
{
...
return("");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−95
char* _getvalue(....)
{
...
return("");
}
return "";
> а ты её не порти!
const
не каждая сишечка может в const
код тупой, но формально ничего не нарушает, поправьте меня
P.S. В gcc 3.x вообще литералы можно было править на ходу, если соотв. опцию включить. Слава богу, что в 4.х эту гадость таки решились выпилить.
Чтобы собрать - придётся править однотипные ошибки целый день. Тысячи их. А всё потому что запретили в c++ неявно брать указатель на функции.
Неявно это как? > придётся править однотипные ошибки целый день
Скриптом не получится?
В плюсах это с новым gcc не работает.
Там используются макросы SetThink, SetTouch и т.д, которые присваивают функции.
Причём, функция может быть NULL, а сами функции - мемеры классов.
И добавление & в макрос не поможет т .к &NULL.
Вообще и без скрипта можно - заменить все обращения к NULL на другие макросы и подправить исходные.
А от -fpermissive очень сложно избавиться т.к нужно везде имя класса приписать, чтобы код был корректен.
5.2.1 это недостаточно новый? В нём работает без -fpermissive с -Wall -Wextra -std=c++98 -pedantic...
Можно пример кода и точную версию gcc?
ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say ‘&foo::test’ [-fpermissive]
Вот эта ошибка что ли?
В новом hlsdk на github исправлены обе ошибки
а шланг++ ругается
похоже, это действительно для совместимости
В принципе возможен такой UB - компилятор отправляет e-mail своему аффтору, тот приезжает и бьёт ебучку автору кода. Всё по стандарту. UB же.
Тортик. Кто смотрел - тот понял, о чём я.
но всех спасёт известный крестовик-путешественник во времени из известного комикса про изучение C++ за 21 день: сначала он порвёт стандарт крестов, но страуструп сожрёт обрывки стандарта и тут же высрет новый, включающий в себя операторы из APL...
конец второй серии
Но её нельзя модифицировать, а в обсуждаемой функции она возвращается как char* вместо const char*. Итого: кто-то модифицировал результат, а программа упала. Автора функции забили камнями.
_______________________________
* если соответствует одному и тому же** литералу
** может и разным одинаковым, если работает соответствующая оптимизация: http://ideone.com/UHBYKm
Хотя это был риторический вопрос,
да.
На все пятизначные можно расширить.
За 32хбитными числами заходите чуть позже.
Сделай их платными.
access violation at 0xdeadbeef память не может быть write? :)
Причём если нормальная ось, то ты хоть краш получишь... А вот во всяком embedded там или молча разрешат писать и запорют все аналогичные литералы (если защиты памяти нет), или молча не запишут (если это какая-нибудь труъ r/o флешка).
Во всяком embedded еще нет защищенного режима?
А от него даже на x86 толку никакого, если paging не включить. Одно слово "защищённый" :) Можно, конечно, изъябываться с отдельными сегментами под всё подряд и far указателями, но 99% компиляторов уже разучились с ними работать...
А на контроллерах - да, даже MPU (memory protection unit, который в отличие от MMU не умеет адреса страничек транслировать, только защищать) и то не везде есть, что уж говорить про полноценный MMU...
>А на контроллерах
А embedded и контроллеры это разве одно и то же? Я думал на всем embedded уже питух или хотя бы vxworks
Не, на те же cortex'ы ты линуху не загонишь... Да и задачи у них не те.
> paging
Страничная трансляция, или как это по-русски. Короче когда у тебя виртуальная память разбита на странички, к примеру, по 4к. И есть специальные таблицы, в которых для каждой такой странички написано, какой физический адрес ей соответствует (если она не высвопана) и какие ограничения по доступу (user/supervisor, read/write/execute). За счёт этого оси делают изоляцию процессов друг от друга, своп и т.п. Как-то так, если не вдаваться в детали :)
Кстати, жаль, что от far отказались, ведь с ними можно было иметь 64 гигабайта виртуальной памяти (вместо четырёх) даже на 32-битных машинах.
*****
Говорят, что в OS/2 использовалось три кольца защиты, а в Windows почему-то от кольца 2 отказалась, оставив только 3 и 0. Означает ли это, что Windows менее безопасна, чем OS/2?
Windows однозначно менее безопасна потому что на ней есть юзеры, а значит и стимул писать вредоносный софт.
Это как? Там же в защищённом режиме far не такой, как в реалмоде, за 32 бита виртуальной памяти никак не вылезти.
> а в Windows почему-то от кольца 2 отказалась, оставив только 3 и 0
А в amd64 и от сегментации отказались, оставив только пейджинг...
В защищённом режиме адрес транслируется джважды:
- из логического (logical) адреса (селектор сегмента + смещение) в линейный (linear)
- и из линейного (linear) адреса в физический (physical)
Селектор сегмента это, грубо говоря, его номер в табличке с дескрипторами сегментов (их может быть две - GDT и LDT). Каждый дескриптор - это структурка, в которой описано, с какого линейного адреса начинается данный сегмент (base), какого он размера (limit) что с ним можно делать (read/write/execute), кому к нему можно лезть и ещё куча всякой хуиты. Ну соответственно трансляция идёт тупо - ищем в табличке дескриптор, проверяем права и прибавляем смещение к base из дескриптора...
Т.е. в теории, сишный указатель у тебя должен состоять из джвух частей - селектора и смещения...
Но, на деле, почти все 32-битные операционки юзали эти сегменты очень тупо - выставляли базу в 0, лимит где-нибудь на 2-4 гига, из-за этого linear адрес совпадал с logical, по сути отрубая всю сегментацию нахуй (так называемая flat модель памяти). И компиляторы вообще разучились работать с чем-то кроме этой модели. Поэтому amd, когда запиливало свой 64-битный long mode, тупо выкинуло всю эту сегментацию нахуй, чтобы проц быстрее работал.
Забыл написать, что вот эта вторая трансляция - это и есть пейджинг, про который говорили выше.
Расскажи как потом часть процессора, ответственная за доступ к памяти выставляет этот адрес и как на него могут отзываться устройства при MMIO и всякие другие ROM, или как на него отвечает контроллер памяти.
Как контроллер выбирает сначала канал, затем ранг и делает ему chip select, как выбирает колонку и ряд, как открываются в банках маленькие кондёры и как падают, в конце концов, заряды на чувствительные усилители.
Для прикладника там вообще ничего нового, только 64-битность завезли да пачку дополнительных регистров.
Попытались заодно сделать единое соглашение о вызовах, но не проканало. Зато их теперь всего 2 - у майкрософта и у всех остальных.
Ну а для системщика - ещё один уровень в таблице страниц, выпиливание сегментации и быстрые системные вызовы (которые, к слову, интел умудрился неправильно переписать у amd и устроить кроссплатформенное решето сразу в куче операционок и гипервизоров...)
Да, если не вникать в тонкости так и есть. База на нуле, лимит не проверяется. И проверки прав на всём, кроме кодовых сегментов тоже убрали. В 64-битной операционке все права разруливаются на уровне страничек...
Дык всё это на уровне страниц и разруливается.
А вот NX (бит запрета исполнения странички) появился относительно поздно.
Как? У меня сегменты ассоциируются с реальным режимом.
Неправда. В cs, ds и т.п. лежали ненулевые селекторы. Просто у дескрипторов, на которые они указывали, база была выкручена в 0. Ну и регистры fs и gs юзали (и даже на amd64 продолжают юзать) для всяких thread local блоков.
Дык их только юзермод юзает, а ядро даже не читает (а если читает - то проверяет на 100600 раз)... Разве не так?
Я имел ввиду что никто не пользовался реально сегментами так, как то имел ввиду интел в 8086 когда данные лежат в DS, код в CS итд. Все делали как-бы плоскую модель
«Но операционки эту фичу один хер не юзали.»
В Windows поддержка флага NX появилась только в Висте (под названием DEP), да и то по умолчанию включена только для системных процессов, а пользовательские программы не защищены. Если включить DEP для всех процессов, то заколебёшься добавлять в список исключений программы, написанные Царями, которые так и норовят что-нибудь исполнять в стеке или в данных.
А для кернел спейса был Physical Address Extensions чтобы заюзать хотя бы 36 (или сколько там было) бит адреса. В теории он позволял юзать все 64, но дорожек-то было всего 36. Им тоже редко пользовались.
А вообще long mode уже существует 10 почти что лет. Пора бы уже.
>Не, на те же cortex'ы ты линуху не загонишь...
Да, но считаются ли микроконтроллеры embedded? В моем понимании это гавно типа домашних рутеров.
Да вроде как любой проц, встроенный в любую железку (кроме универсальных компов) считается...
В 286м был протектед мод, а пейджинга не было (только сегментная адресация).
По этой причине в мире существует 0 программ, которые используют защищенный режим в 286
А вот отсутствие пейджинга ставило крест на какой-либо серьезной многозадачности.
Но был ещё виртуальный режим, который для приложения выглядел как реальный, а с внешней стороны выглядел как защищённый. В частности, виртуальный режим использовал менеджер памяти EMM (и его заменители типа QEMM), выделяя в памяти «реального режима» окно размером 32 или 64 килобайта, которое по требованию приложений отображал на произвольное окно «защищённого режима». Кстати, досовские программы при запуске из-под Windows работают в виртуальном режиме. В виртуальном режиме можно «защищать» не только память, но и порты ввода-вывода, что и делает Windows, эмулируя для досовского приложения видеокарту.
Был ещё шуточный «нереальный режим», который серьёзными программами не использовался, потому что несовместим с менеджерами памяти: переключаемся в защищённый режим, ставим лимит сегмента равным четырём гигабайтам, переключаемся обратно в реальный режим и имеем доступ ко всей оперативке с помощью инструкций с префиксом размера смещения (адрес получается как (16-битный сегмент << 16) + 32-битное смещение). Естественно, в «нереальном режиме» никакой защиты не было, как и в реальном.
Это мегакрутые книжки
Крутость книг не в том что они для Гуру, а в том что там ОЧЕНЬ хорошо и внятно разжовано как работает архитектура писи начиная с 8086. Еще там есть годные книги по шинам вроде PCI, USB, PCI-Express итд
Любая программа имела полный доступ ко всей памяти.
Вот ты говоришь mov по такому-то адресу, и проц реально выставляет такой адрес на шину, и там его ловит контроллер памяти (ну или какая-то другая железяка).
То есть даже в случае некоторой многозадачности (например обработчик прерывания мог считаться другой задачей) ты мог всё всем засрать.
Ну вот я взял, и написал хеллоу ворлд который затер все обработчики прерываний, и даже клавиатура не работает, и нужен ребут.
Все таки в 286 так сделать было нельзя: твой адрес был виртуальным, и его потом MMU переводил в реальный.
Адрес этот указывался в формате сегмент:смещение.
При преобразовании использовалась таблица сегментов, которая была своя для каждого процесса.
Но пейджинга не было, загрузить с диска ничего было нельзя, так что если у тебя одна программа съела 500 килобайт, то другая не может съесть больше чем 500 килобайт.
Операционка (еслиб такая была) должна была за этим следить и выдавать память процессам.
Короче представь что у тебя 32бит режим, но не 4Гб а 1Мб памяти максимум и свап файла нету.
Но это все теория: не было вроде таких операционок
Ну это понятно, именно из-за это и ушли с доса.
Что есть пейджинг? Дай нормальный термин, хоть на английском. Поддержка виртуальной памяти? Она реализуется каким-то флагом, с которым при обращении к странице процессор генерирует исключение, которое может хватать ось и подгружать нужную страницу.
Да.
> Ее не было в 286?
Нет.
> А что было?
Таблички с дескрипторами сегментов (GDT, насчёт LDT не помню, мож и не было ещё). Причём эти сегменты были маленькие и 16-битные. И из-за совместимости с этим нахуй никому не нужным говном сейчас дескрипторы выглядят как ёбаная каша...
Хуй86 из-за обратной совместимости сам говно, дорогое и раза в 3 менее энергоэффективное, хорошо бы его самого выкинуть нахуй и уйти на risc.
механизм защиты работал на уровне сегментов
И как он работал?
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
Сойдёт? Размера не пугайся, там большую часть занимает второй том со списком всех инструкций.
Русня, что ли? Сам туда иди, пидар!
Там риск или VLIW?
Хуясе. Пека-на-палочке с четырехядерным армом и видюхой с декодером видео за 30 евро бывает.
С инструментами разработки под армом сейчас тоже вроде все нормально (разве что не знаю как там с оракуловской явой). Проблема разве что в нешвабодном софте - но благодаря конпеляции в байткод и тут все станет лучше, больше проблем с другой осью / тачскрином вместо мыши/клавы / другим разрешением.
А там в дескрипторах тоже были биты, отвечающие за кольцо защиты. Если ты из юзермодной проги попытаешься положить, к примеру, в ds какой-то селектор, предназначенный для ядра, то проц бросит исключение, ядро обработает его и убьёт твою прогу нахуй ;)
Ну и аналогично с исполняемостью/неисполняемостью. В cs просто невозможно засунуть селектор, у которого в дескрипторе нету флажка про исполняемость и наоборот, в остальные сегментные регистры не лезут селекторы с флажком исполняемости.
Само собой, юзермоду никто не давал дескриптора, который покрывает GDT. Поэтому сам он там ничего поправить не мог. И сосал хуй, юзая только разрешённые селекторы и, соответственно, куски памяти...
Ты не путай риалмод и защищённый режим.
В риалмоде линейный адрес (он же и физический) считается как сегмент*16 + смещение и нету никаких дескрипторных таблиц. Вот тут как раз можно комбинировать как душе угодно: 0xF000 : 0x1000, 0xF100 : 0x0000 и т.п. Этот говнорежим для совместимости есть даже в новейших 64-битных процах...
В защищённом режиме (даже у 286) уже были дескрипторные таблицы, и линейный адрес считается как GDT[селектор].база + смещение, а потом (если у тебя 386+) проходит страничную трансляцию. Да, тут сегменты тоже могут наложиться друг на друга. Но только если их так описали в таблице (т.е. намеренно).
В long mode amd64 линейный адрес тупо равен смещению (если инструкция не юзает сегментные регистры fs и gs, у которых таки может быть ненулевая база).
>а потом (если у тебя 386+) проходит страничную трансляцию.
Так в чем разница, блжад? Что такое страничная трансляция? Ссылочку можно?
Сегменты произвольной длины, а странички - одинаковой (ну, вернее, одной из 4 доступных).
протектед мод 286: реальный адрес есть функция от (процесс, сегмент, смещение)
протектед мод 386: реальный адрес есть функция от (процесс, линейный_адрес)
а линейный_адрес это функция от (процесс, сегмент, смещение).
Не запутывай, там же только значения в регистрах учитываются :) А при смене процесса (адресного пространства) просто перезагружаются сегментные регистры и CR3.
P.S. Да, я знаю про task'и.
Я тебя расстрою. Потоков он тоже не видит... Это просто такая абстракция в операционках.
Не запутывай его, плиз... У чувака и так крышу сносит от нашей криво переведённой терминологии ;) На русском такие темы лучше вообще не рассматривать.
> record in __page table__
Вот это.
Запись же ищется в page table по линейному адресу, а не просто хранится в GDT/LDT (как кажется по твоей фразе).
Ну я же дал тебе книжку. Том третий (system programming guide). Глава 3.1 Memory management overview. Там кратко и по теме. А чуть ниже картинка есть, которая называется segmentation and paging. Дальше по тексту подробности.
Ну ок, скачал твоего зубкова...
Глава 10.4 Сегментная адресация
Глава 10.6 Страничная адресация
Сам не мог открыть содержание? :)
Блин, не могу найти нормальную статью, чтобы с нуля понятно было и с картинками... Запилить что ли себе блог, да попробовать объяснить всю эту питушню понятным языком...
Нельзя объяснить кусок какой-то концепции с середины если ты не знаешь начала и конца. Читай про архитектуру 8086 с самого начала, хочешь Зубкова, хочешь Юрова, хочешь Ирвина, хочешь вообще Гука. Это тебе не PHPMyAdmin, тут в двух словах не объяснишь
А борманд пойдёт в Hyperdevotion Noire играться.
Угу.
Не хочу. Это винду ставить.
Тогда я лучше фансервисных няшек погоняю.
Аж ко всему МЕГАБАЙТУ!
прострел ноги у сишников всегда впереди
Но матёрому сишнику пуля не наносит урона, потому что пролетает через разработанное годами отверстие.
Пошловатенько звучит. была разработана настолько, что без труда могла вместить любой access violation
Будем считать что ноги сишников напоминают решето.
- Нет, я сишник
- Ясно. Лучше бы ты в ноги ебался - такие сишники нам не нужны