- 1
- 2
- 3
- 4
- 5
char* _getvalue(....)
{
...
return("");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−95
char* _getvalue(....)
{
...
return("");
}
FlySnake 01.10.2015 20:47 # +3
CHayT 01.10.2015 21:50 # 0
Elvenfighter 01.10.2015 22:04 # +1
CHayT 01.10.2015 22:06 # 0
Elvenfighter 01.10.2015 23:16 # +1
return "";
> а ты её не порти!
const
absolut 03.10.2015 13:41 # −1
не каждая сишечка может в const
bormand 03.10.2015 16:51 # +4
CHayT 04.10.2015 00:18 # 0
код тупой, но формально ничего не нарушает, поправьте меня
absolut 04.10.2015 08:52 # +1
bormand 04.10.2015 10:31 # +1
P.S. В gcc 3.x вообще литералы можно было править на ходу, если соотв. опцию включить. Слава богу, что в 4.х эту гадость таки решились выпилить.
mittorn 05.11.2015 01:46 # 0
Чтобы собрать - придётся править однотипные ошибки целый день. Тысячи их. А всё потому что запретили в c++ неявно брать указатель на функции.
bormand 05.11.2015 17:25 # 0
Неявно это как? > придётся править однотипные ошибки целый день
Скриптом не получится?
mittorn 05.11.2015 19:47 # 0
В плюсах это с новым gcc не работает.
Там используются макросы SetThink, SetTouch и т.д, которые присваивают функции.
Причём, функция может быть NULL, а сами функции - мемеры классов.
И добавление & в макрос не поможет т .к &NULL.
Вообще и без скрипта можно - заменить все обращения к NULL на другие макросы и подправить исходные.
А от -fpermissive очень сложно избавиться т.к нужно везде имя класса приписать, чтобы код был корректен.
bormand 05.11.2015 19:52 # 0
5.2.1 это недостаточно новый? В нём работает без -fpermissive с -Wall -Wextra -std=c++98 -pedantic...
Можно пример кода и точную версию gcc?
mittorn 09.11.2015 08:32 # 0
bormand 05.11.2015 19:57 # 0
ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say ‘&foo::test’ [-fpermissive]
Вот эта ошибка что ли?
mittorn 09.11.2015 08:31 # 0
В новом hlsdk на github исправлены обе ошибки
bormand 09.11.2015 17:59 # 0
bormand 05.11.2015 20:03 # +1
bormand 05.11.2015 20:16 # 0
bormand 05.11.2015 20:25 # 0
schwrzwldr_gbln 04.10.2015 13:56 # 0
CHayT 04.10.2015 17:50 # 0
а шланг++ ругается
похоже, это действительно для совместимости
guest 07.11.2015 05:42 # +4
3.14159265 07.11.2015 13:46 # +4
В принципе возможен такой UB - компилятор отправляет e-mail своему аффтору, тот приезжает и бьёт ебучку автору кода. Всё по стандарту. UB же.
guest 10.11.2015 21:04 # +3
bormand 10.11.2015 21:16 # +2
Тортик. Кто смотрел - тот понял, о чём я.
CHayT 10.11.2015 21:24 # +2
bormand 10.11.2015 21:32 # +2
guest 10.11.2015 21:39 # 0
bormand 10.11.2015 21:42 # +3
guest 10.11.2015 21:45 # +3
bormand 10.11.2015 21:50 # 0
inkanus-gray 10.11.2015 21:52 # 0
guest 10.11.2015 21:54 # 0
kegdan 11.11.2015 07:29 # 0
CHayT 10.11.2015 22:26 # +1
но всех спасёт известный крестовик-путешественник во времени из известного комикса про изучение C++ за 21 день: сначала он порвёт стандарт крестов, но страуструп сожрёт обрывки стандарта и тут же высрет новый, включающий в себя операторы из APL...
конец второй серии
Stallman 11.11.2015 00:52 # 0
kegdan 11.11.2015 07:28 # 0
Bobik 02.10.2015 14:54 # +2
3_14dar 05.11.2015 23:37 # 0
1024-- 06.11.2015 00:23 # 0
Но её нельзя модифицировать, а в обсуждаемой функции она возвращается как char* вместо const char*. Итого: кто-то модифицировал результат, а программа упала. Автора функции забили камнями.
_______________________________
* если соответствует одному и тому же** литералу
** может и разным одинаковым, если работает соответствующая оптимизация: http://ideone.com/UHBYKm
3_14dar 06.11.2015 09:19 # +1
1024-- 06.11.2015 10:53 # 0
Хотя это был риторический вопрос,
да.
3_14dar 06.11.2015 11:47 # 0
1024-- 06.11.2015 14:40 # 0
TarasB 06.11.2015 15:15 # 0
1024-- 06.11.2015 17:27 # +1
На все пятизначные можно расширить.
За 32хбитными числами заходите чуть позже.
3.14159265 06.11.2015 21:38 # +1
Сделай их платными.
bormand 06.11.2015 17:02 # +1
access violation at 0xdeadbeef память не может быть write? :)
Причём если нормальная ось, то ты хоть краш получишь... А вот во всяком embedded там или молча разрешат писать и запорют все аналогичные литералы (если защиты памяти нет), или молча не запишут (если это какая-нибудь труъ r/o флешка).
3_14dar 06.11.2015 17:09 # +1
Во всяком embedded еще нет защищенного режима?
bormand 06.11.2015 17:17 # +2
А от него даже на x86 толку никакого, если paging не включить. Одно слово "защищённый" :) Можно, конечно, изъябываться с отдельными сегментами под всё подряд и far указателями, но 99% компиляторов уже разучились с ними работать...
А на контроллерах - да, даже MPU (memory protection unit, который в отличие от MMU не умеет адреса страничек транслировать, только защищать) и то не везде есть, что уж говорить про полноценный MMU...
3_14dar 06.11.2015 18:14 # 0
>А на контроллерах
А embedded и контроллеры это разве одно и то же? Я думал на всем embedded уже питух или хотя бы vxworks
bormand 06.11.2015 19:32 # +1
Не, на те же cortex'ы ты линуху не загонишь... Да и задачи у них не те.
> paging
Страничная трансляция, или как это по-русски. Короче когда у тебя виртуальная память разбита на странички, к примеру, по 4к. И есть специальные таблицы, в которых для каждой такой странички написано, какой физический адрес ей соответствует (если она не высвопана) и какие ограничения по доступу (user/supervisor, read/write/execute). За счёт этого оси делают изоляцию процессов друг от друга, своп и т.п. Как-то так, если не вдаваться в детали :)
inkanus-gray 06.11.2015 19:58 # 0
Кстати, жаль, что от far отказались, ведь с ними можно было иметь 64 гигабайта виртуальной памяти (вместо четырёх) даже на 32-битных машинах.
*****
Говорят, что в OS/2 использовалось три кольца защиты, а в Windows почему-то от кольца 2 отказалась, оставив только 3 и 0. Означает ли это, что Windows менее безопасна, чем OS/2?
3_14dar 06.11.2015 20:12 # 0
Windows однозначно менее безопасна потому что на ней есть юзеры, а значит и стимул писать вредоносный софт.
bormand 06.11.2015 20:19 # 0
Это как? Там же в защищённом режиме far не такой, как в реалмоде, за 32 бита виртуальной памяти никак не вылезти.
> а в Windows почему-то от кольца 2 отказалась, оставив только 3 и 0
А в amd64 и от сегментации отказались, оставив только пейджинг...
3_14dar 06.11.2015 20:28 # 0
bormand 06.11.2015 21:01 # +2
В защищённом режиме адрес транслируется джважды:
- из логического (logical) адреса (селектор сегмента + смещение) в линейный (linear)
- и из линейного (linear) адреса в физический (physical)
Селектор сегмента это, грубо говоря, его номер в табличке с дескрипторами сегментов (их может быть две - GDT и LDT). Каждый дескриптор - это структурка, в которой описано, с какого линейного адреса начинается данный сегмент (base), какого он размера (limit) что с ним можно делать (read/write/execute), кому к нему можно лезть и ещё куча всякой хуиты. Ну соответственно трансляция идёт тупо - ищем в табличке дескриптор, проверяем права и прибавляем смещение к base из дескриптора...
Т.е. в теории, сишный указатель у тебя должен состоять из джвух частей - селектора и смещения...
Но, на деле, почти все 32-битные операционки юзали эти сегменты очень тупо - выставляли базу в 0, лимит где-нибудь на 2-4 гига, из-за этого linear адрес совпадал с logical, по сути отрубая всю сегментацию нахуй (так называемая flat модель памяти). И компиляторы вообще разучились работать с чем-то кроме этой модели. Поэтому amd, когда запиливало свой 64-битный long mode, тупо выкинуло всю эту сегментацию нахуй, чтобы проц быстрее работал.
bormand 06.11.2015 21:07 # 0
Забыл написать, что вот эта вторая трансляция - это и есть пейджинг, про который говорили выше.
guest 07.11.2015 02:25 # 0
Расскажи как потом часть процессора, ответственная за доступ к памяти выставляет этот адрес и как на него могут отзываться устройства при MMIO и всякие другие ROM, или как на него отвечает контроллер памяти.
Как контроллер выбирает сначала канал, затем ранг и делает ему chip select, как выбирает колонку и ряд, как открываются в банках маленькие кондёры и как падают, в конце концов, заряды на чувствительные усилители.
3_14dar 09.11.2015 10:54 # 0
bormand 09.11.2015 18:20 # 0
Для прикладника там вообще ничего нового, только 64-битность завезли да пачку дополнительных регистров.
Попытались заодно сделать единое соглашение о вызовах, но не проканало. Зато их теперь всего 2 - у майкрософта и у всех остальных.
Ну а для системщика - ещё один уровень в таблице страниц, выпиливание сегментации и быстрые системные вызовы (которые, к слову, интел умудрился неправильно переписать у amd и устроить кроссплатформенное решето сразу в куче операционок и гипервизоров...)
3_14dar 10.11.2015 01:30 # 0
bormand 10.11.2015 06:16 # 0
3_14dar 06.11.2015 21:25 # 0
bormand 06.11.2015 21:31 # 0
Да, если не вникать в тонкости так и есть. База на нуле, лимит не проверяется. И проверки прав на всём, кроме кодовых сегментов тоже убрали. В 64-битной операционке все права разруливаются на уровне страничек...
3_14dar 09.11.2015 10:52 # 0
bormand 09.11.2015 18:02 # 0
Дык всё это на уровне страниц и разруливается.
3_14dar 10.11.2015 01:29 # 0
bormand 10.11.2015 06:17 # 0
А вот NX (бит запрета исполнения странички) появился относительно поздно.
3_14dar 10.11.2015 13:46 # 0
Как? У меня сегменты ассоциируются с реальным режимом.
guest 10.11.2015 16:36 # 0
bormand 10.11.2015 17:59 # +1
Неправда. В cs, ds и т.п. лежали ненулевые селекторы. Просто у дескрипторов, на которые они указывали, база была выкручена в 0. Ну и регистры fs и gs юзали (и даже на amd64 продолжают юзать) для всяких thread local блоков.
inkanus-gray 10.11.2015 18:02 # 0
bormand 10.11.2015 18:10 # +1
Дык их только юзермод юзает, а ядро даже не читает (а если читает - то проверяет на 100600 раз)... Разве не так?
guest 10.11.2015 18:09 # 0
Я имел ввиду что никто не пользовался реально сегментами так, как то имел ввиду интел в 8086 когда данные лежат в DS, код в CS итд. Все делали как-бы плоскую модель
3_14dar 10.11.2015 16:34 # 0
inkanus-gray 10.11.2015 18:15 # +1
«Но операционки эту фичу один хер не юзали.»
В Windows поддержка флага NX появилась только в Висте (под названием DEP), да и то по умолчанию включена только для системных процессов, а пользовательские программы не защищены. Если включить DEP для всех процессов, то заколебёшься добавлять в список исключений программы, написанные Царями, которые так и норовят что-нибудь исполнять в стеке или в данных.
guest 07.11.2015 02:44 # 0
guest 07.11.2015 02:28 # +1
А для кернел спейса был Physical Address Extensions чтобы заюзать хотя бы 36 (или сколько там было) бит адреса. В теории он позволял юзать все 64, но дорожек-то было всего 36. Им тоже редко пользовались.
А вообще long mode уже существует 10 почти что лет. Пора бы уже.
3_14dar 06.11.2015 20:11 # 0
>Не, на те же cortex'ы ты линуху не загонишь...
Да, но считаются ли микроконтроллеры embedded? В моем понимании это гавно типа домашних рутеров.
bormand 06.11.2015 20:18 # 0
Да вроде как любой проц, встроенный в любую железку (кроме универсальных компов) считается...
guest 07.11.2015 02:30 # +1
В 286м был протектед мод, а пейджинга не было (только сегментная адресация).
По этой причине в мире существует 0 программ, которые используют защищенный режим в 286
3_14dar 09.11.2015 10:51 # 0
bormand 09.11.2015 18:02 # 0
guest 10.11.2015 01:15 # 0
А вот отсутствие пейджинга ставило крест на какой-либо серьезной многозадачности.
3_14dar 10.11.2015 01:38 # 0
guest 10.11.2015 05:55 # 0
3_14dar 10.11.2015 13:48 # 0
inkanus-gray 10.11.2015 14:20 # 0
Но был ещё виртуальный режим, который для приложения выглядел как реальный, а с внешней стороны выглядел как защищённый. В частности, виртуальный режим использовал менеджер памяти EMM (и его заменители типа QEMM), выделяя в памяти «реального режима» окно размером 32 или 64 килобайта, которое по требованию приложений отображал на произвольное окно «защищённого режима». Кстати, досовские программы при запуске из-под Windows работают в виртуальном режиме. В виртуальном режиме можно «защищать» не только память, но и порты ввода-вывода, что и делает Windows, эмулируя для досовского приложения видеокарту.
Был ещё шуточный «нереальный режим», который серьёзными программами не использовался, потому что несовместим с менеджерами памяти: переключаемся в защищённый режим, ставим лимит сегмента равным четырём гигабайтам, переключаемся обратно в реальный режим и имеем доступ ко всей оперативке с помощью инструкций с префиксом размера смещения (адрес получается как (16-битный сегмент << 16) + 32-битное смещение). Естественно, в «нереальном режиме» никакой защиты не было, как и в реальном.
3_14dar 10.11.2015 14:42 # 0
3_14dar 10.11.2015 14:43 # 0
guest 10.11.2015 15:43 # 0
Это мегакрутые книжки
3_14dar 10.11.2015 16:05 # 0
guest 10.11.2015 16:33 # 0
Крутость книг не в том что они для Гуру, а в том что там ОЧЕНЬ хорошо и внятно разжовано как работает архитектура писи начиная с 8086. Еще там есть годные книги по шинам вроде PCI, USB, PCI-Express итд
guest 10.11.2015 15:50 # 0
Любая программа имела полный доступ ко всей памяти.
Вот ты говоришь mov по такому-то адресу, и проц реально выставляет такой адрес на шину, и там его ловит контроллер памяти (ну или какая-то другая железяка).
То есть даже в случае некоторой многозадачности (например обработчик прерывания мог считаться другой задачей) ты мог всё всем засрать.
Ну вот я взял, и написал хеллоу ворлд который затер все обработчики прерываний, и даже клавиатура не работает, и нужен ребут.
Все таки в 286 так сделать было нельзя: твой адрес был виртуальным, и его потом MMU переводил в реальный.
Адрес этот указывался в формате сегмент:смещение.
При преобразовании использовалась таблица сегментов, которая была своя для каждого процесса.
Но пейджинга не было, загрузить с диска ничего было нельзя, так что если у тебя одна программа съела 500 килобайт, то другая не может съесть больше чем 500 килобайт.
Операционка (еслиб такая была) должна была за этим следить и выдавать память процессам.
Короче представь что у тебя 32бит режим, но не 4Гб а 1Мб памяти максимум и свап файла нету.
Но это все теория: не было вроде таких операционок
3_14dar 10.11.2015 16:07 # 0
Ну это понятно, именно из-за это и ушли с доса.
Что есть пейджинг? Дай нормальный термин, хоть на английском. Поддержка виртуальной памяти? Она реализуется каким-то флагом, с которым при обращении к странице процессор генерирует исключение, которое может хватать ось и подгружать нужную страницу.
guest 10.11.2015 16:31 # 0
3_14dar 10.11.2015 16:35 # 0
bormand 10.11.2015 18:02 # 0
3_14dar 10.11.2015 18:09 # 0
guest 10.11.2015 18:13 # 0
bormand 10.11.2015 18:13 # +1
Да.
> Ее не было в 286?
Нет.
> А что было?
Таблички с дескрипторами сегментов (GDT, насчёт LDT не помню, мож и не было ещё). Причём эти сегменты были маленькие и 16-битные. И из-за совместимости с этим нахуй никому не нужным говном сейчас дескрипторы выглядят как ёбаная каша...
3_14dar 10.11.2015 18:16 # 0
Хуй86 из-за обратной совместимости сам говно, дорогое и раза в 3 менее энергоэффективное, хорошо бы его самого выкинуть нахуй и уйти на risc.
guest 10.11.2015 18:17 # 0
механизм защиты работал на уровне сегментов
3_14dar 10.11.2015 18:20 # 0
И как он работал?
bormand 10.11.2015 18:23 # +1
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
Сойдёт? Размера не пугайся, там большую часть занимает второй том со списком всех инструкций.
inkanus-gray 10.11.2015 18:18 # 0
3_14dar 10.11.2015 18:21 # 0
Русня, что ли? Сам туда иди, пидар!
Там риск или VLIW?
inkanus-gray 10.11.2015 18:23 # 0
guest 10.11.2015 18:21 # +1
3_14dar 10.11.2015 18:24 # +2
Хуясе. Пека-на-палочке с четырехядерным армом и видюхой с декодером видео за 30 евро бывает.
С инструментами разработки под армом сейчас тоже вроде все нормально (разве что не знаю как там с оракуловской явой). Проблема разве что в нешвабодном софте - но благодаря конпеляции в байткод и тут все станет лучше, больше проблем с другой осью / тачскрином вместо мыши/клавы / другим разрешением.
bormand 10.11.2015 18:28 # 0
А там в дескрипторах тоже были биты, отвечающие за кольцо защиты. Если ты из юзермодной проги попытаешься положить, к примеру, в ds какой-то селектор, предназначенный для ядра, то проц бросит исключение, ядро обработает его и убьёт твою прогу нахуй ;)
Ну и аналогично с исполняемостью/неисполняемостью. В cs просто невозможно засунуть селектор, у которого в дескрипторе нету флажка про исполняемость и наоборот, в остальные сегментные регистры не лезут селекторы с флажком исполняемости.
Само собой, юзермоду никто не давал дескриптора, который покрывает GDT. Поэтому сам он там ничего поправить не мог. И сосал хуй, юзая только разрешённые селекторы и, соответственно, куски памяти...
3_14dar 10.11.2015 18:33 # 0
guest 10.11.2015 18:37 # 0
bormand 10.11.2015 18:38 # +1
Ты не путай риалмод и защищённый режим.
В риалмоде линейный адрес (он же и физический) считается как сегмент*16 + смещение и нету никаких дескрипторных таблиц. Вот тут как раз можно комбинировать как душе угодно: 0xF000 : 0x1000, 0xF100 : 0x0000 и т.п. Этот говнорежим для совместимости есть даже в новейших 64-битных процах...
В защищённом режиме (даже у 286) уже были дескрипторные таблицы, и линейный адрес считается как GDT[селектор].база + смещение, а потом (если у тебя 386+) проходит страничную трансляцию. Да, тут сегменты тоже могут наложиться друг на друга. Но только если их так описали в таблице (т.е. намеренно).
В long mode amd64 линейный адрес тупо равен смещению (если инструкция не юзает сегментные регистры fs и gs, у которых таки может быть ненулевая база).
3_14dar 10.11.2015 18:41 # 0
>а потом (если у тебя 386+) проходит страничную трансляцию.
Так в чем разница, блжад? Что такое страничная трансляция? Ссылочку можно?
bormand 10.11.2015 18:49 # 0
Сегменты произвольной длины, а странички - одинаковой (ну, вернее, одной из 4 доступных).
guest 10.11.2015 18:49 # 0
протектед мод 286: реальный адрес есть функция от (процесс, сегмент, смещение)
протектед мод 386: реальный адрес есть функция от (процесс, линейный_адрес)
а линейный_адрес это функция от (процесс, сегмент, смещение).
bormand 10.11.2015 18:53 # 0
Не запутывай, там же только значения в регистрах учитываются :) А при смене процесса (адресного пространства) просто перезагружаются сегментные регистры и CR3.
P.S. Да, я знаю про task'и.
3_14dar 10.11.2015 19:00 # 0
bormand 10.11.2015 19:03 # 0
Я тебя расстрою. Потоков он тоже не видит... Это просто такая абстракция в операционках.
guest 10.11.2015 19:08 # 0
bormand 10.11.2015 19:11 # 0
Не запутывай его, плиз... У чувака и так крышу сносит от нашей криво переведённой терминологии ;) На русском такие темы лучше вообще не рассматривать.
guest 10.11.2015 19:20 # 0
bormand 10.11.2015 19:26 # 0
> record in __page table__
Вот это.
Запись же ищется в page table по линейному адресу, а не просто хранится в GDT/LDT (как кажется по твоей фразе).
3_14dar 10.11.2015 19:47 # 0
guest 10.11.2015 19:52 # +1
3_14dar 10.11.2015 22:21 # 0
guest 10.11.2015 22:21 # 0
3_14dar 10.11.2015 22:24 # 0
bormand 10.11.2015 19:52 # 0
bormand 10.11.2015 19:59 # 0
Ну я же дал тебе книжку. Том третий (system programming guide). Глава 3.1 Memory management overview. Там кратко и по теме. А чуть ниже картинка есть, которая называется segmentation and paging. Дальше по тексту подробности.
3_14dar 10.11.2015 19:00 # 0
bormand 10.11.2015 19:07 # 0
Ну ок, скачал твоего зубкова...
Глава 10.4 Сегментная адресация
Глава 10.6 Страничная адресация
Сам не мог открыть содержание? :)
3_14dar 10.11.2015 19:44 # 0
bormand 10.11.2015 19:52 # 0
3_14dar 10.11.2015 20:06 # 0
bormand 10.11.2015 18:55 # +1
Блин, не могу найти нормальную статью, чтобы с нуля понятно было и с картинками... Запилить что ли себе блог, да попробовать объяснить всю эту питушню понятным языком...
3_14dar 10.11.2015 19:00 # 0
guest 10.11.2015 19:05 # 0
Нельзя объяснить кусок какой-то концепции с середины если ты не знаешь начала и конца. Читай про архитектуру 8086 с самого начала, хочешь Зубкова, хочешь Юрова, хочешь Ирвина, хочешь вообще Гука. Это тебе не PHPMyAdmin, тут в двух словах не объяснишь
3_14dar 10.11.2015 19:46 # 0
guest 10.11.2015 19:47 # 0
bormand 10.11.2015 20:02 # 0
А борманд пойдёт в Hyperdevotion Noire играться.
3_14dar 10.11.2015 20:06 # 0
bormand 10.11.2015 20:09 # 0
Stallman 10.11.2015 20:27 # 0
bormand 10.11.2015 20:27 # 0
Угу.
guest 10.11.2015 20:31 # +3
kegdan 10.11.2015 20:35 # 0
Vasiliy 10.11.2015 20:38 # 0
bormand 10.11.2015 20:46 # 0
Не хочу. Это винду ставить.
kegdan 10.11.2015 20:48 # 0
bormand 10.11.2015 20:51 # 0
Тогда я лучше фансервисных няшек погоняю.
kegdan 10.11.2015 20:57 # 0
3_14dar 10.11.2015 22:20 # 0
3_14dar 10.11.2015 20:05 # 0
bormand 10.11.2015 18:01 # 0
Аж ко всему МЕГАБАЙТУ!
3.14159265 06.11.2015 21:39 # +5
прострел ноги у сишников всегда впереди
bormand 06.11.2015 21:54 # +5
Но матёрому сишнику пуля не наносит урона, потому что пролетает через разработанное годами отверстие.
3.14159265 06.11.2015 22:44 # +3
Пошловатенько звучит. была разработана настолько, что без труда могла вместить любой access violation
Будем считать что ноги сишников напоминают решето.
kegdan 09.11.2015 18:32 # +2
- Нет, я сишник
- Ясно. Лучше бы ты в ноги ебался - такие сишники нам не нужны