%NF
//Код, вызывающий sigsegv
include
//comment include and SIGSEGV will disappear
include
int do_stuff(int num) { return isdigit(num); }
int main(int argc, const char *argv[]) { printf("%d\n", do_stuff(0xf0f0f0f0));
return 0; }
%NE
Содержание
isdigit. История одного SIGSEGV.
Функция isdigit входит в стандарт ISO C90 и является встроенной (builtin) функцией gcc (каждый раз на место вызова функции вставляется код функции).
Таким образом если в коде не определён свой вариант isdigit или не используется флаг компиляции -fno-builtin (который отключает поддержку встроенных функций) gcc будет вставлять свой вариант кода.
Кроме того функция isdigit определена glibc
При использовании заголовочного файла ctype.h импортируется макрос
%NF
define isdigit(c) __isctype((c), _ISdigit) %NE
в свою очередь __isctype определяется как
%NF
define __isctype(c, type) \
((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type)%NE
функция __ctype_b_loc возвращает массив где для каждому символу в соответствие ставится набор флагов
%NE enum {
_ISupper = _ISbit (0), /* UPPERCASE. */ _ISlower = _ISbit (1), /* lowercase. */ _ISalpha = _ISbit (2), /* Alphabetic. */ _ISdigit = _ISbit (3), /* Numeric. */ _ISxdigit = _ISbit (4), /* Hexadecimal numeric. */ _ISspace = _ISbit (5), /* Whitespace. */ _ISprint = _ISbit (6), /* Printing. */ _ISgraph = _ISbit (7), /* Graphical. */ _ISblank = _ISbit (8), /* Blank (usually SPC and TAB). */ _IScntrl = _ISbit (9), /* Control character. */ _ISpunct = _ISbit (10), /* Punctuation. */ _ISalnum = _ISbit (11) /* Alphanumeric. */}; %NF
Доступ к флагам символа осуществляется по коду символа. Кроме того в макросе __isctype не осуществляется проверки того, что возвращаемое значение не выходит за границы массива. Поэтому передав достаточно большое число можно обратиться к неинициализированной области памяти.
Пару слов о себе:
- Быдлокодер ([https://github.com/dzruyk| линк на гитхаб аккаунт ]);
- Адепт лаборатории с октября 2010;
- В дипломе на фото трояк за дисциплину «Язык программирования Си» подтверждающий мои глубокие знания в этой сфере;
- Закончил СыктГУ в 2013 году, выпустился со специальности КЗОИ;
- [https://github.com/dzruyk/crypti | Линк на практическую часть ВКР] (сам текст ВКР был посеян).
- Мне кажется, что она вовсе не была посеяна. Тебе просто стыдно показывать её, т. к. она, скорее всего, была безобразно свёрстана в OpenOffice? :-D
- Она была безобразно свёрстана в MS Word, однако я её всё же посеял. Зачем стыдиться исторических фактов?
- UPD: Нашёл текст ВКР, прикопал в [https://github.com/dzruyk/crypti/blob/master/doc/diploma.docx | репозитории]
На занятиях лаборатории Боря был исключительно вредный и дотошный, иногда даже хотелось бросить в него фломастером. -- СиткаревГригорий
Статья про VIM
%NF
TODO статьи:
- добавить раздел про табы (tabe);
- описание буферов и работы с ними (:ls/:b/);
- ctags;
- разделение экрана на несколько областей :vsplit, :split, ...
- полезные плагины.
%NE
Небольшой конспект по поводу возможностей редактора Vim.
Если вы слышите о нём в первый раз или никогда не пользовались, то в разделе "Используемые источники" можно ознакомится с книгами и публикациями о Vim, где он описан гораздо лучше. [http://ru.wikibooks.org/wiki/Vim|Пример]. Либо можно пройти встроенный в vim ознакомительный курс, для этого в командной строке нужно ввести vimtutor
1. Режимы Vim
Vim поддерживает несколько режимов работы. Это означает, что действие клавиш и их комбинаций различается в зависимости от того, в каком режиме вы сейчас находитесь
Командный режим
Режим по умолчанию. Из него осуществляется переход в другие режимы и выполнение команд.
Клавиша перехода - ESC.
Все команды из разделов 2 - 10 выполняются из этого режима.
Режим ввода
Клавиши перехода:
- * i
- ввод с текущего символа;
- a - ввод со следующего символа;
- o - перейти в режим ввода с новой строки под курсором;
- O - перейти в режим ввода с новой строки над курсором;
- I - переместиться в начало строки и перейти в режим ввода;
- A - переместиться в конец строки и перейти в режим ввода;
Режим выделения
Клавиши перехода:
- v - посимвольное выделение;
- V - построчное выделение.
Режим замены
Клавиша перехода - R.
2. Работа с файлами и сессиями
:mksession - создать файл сессии (в файл Session.vim сохраняется информация о настройках и всех открытых файлах и буферах);
source Session.vim - загрузить файл сессии (все настройки и открытые в прошлый раз окна восстанавливаются);
:eFILE - открывает FILE на редактирование;
:w\[FILE] - записывает сделанные изменения в открытый файл или FILE, если он указан;
:q - выход из vim. При :q! выход без записи сделанных изменений;
РЕМАРКА: - можно смешивать несколько команд в одну. Например - :wq
3. Перемещение
Перемещение курсора:
%NF влево / вниз / вверх / вправо
h / j / k / l%NE
РЕМАРКА: Удобство в том, что при такой раскладке пальцы всегда лежат на большинстве нужных клавиш, и не нужно перемещать руку от букв к клавишам стрелок.
^ - курсор в начало строки;
$ - курсор в конец строки;
w - курсор в начало следующего слова;
b - курсор в начало предыдущего слова;
{NUM}gg - переход на {NUM} строку;
G - переход в конец файла;
ctrl + y - экран на 1 строку вверх;
ctrl + e - экран на 1 строку вниз;
ctrl + u - экран на 1/2 страницы вверх;
ctrl + d - экран на 1/2 страницы вниз;
ctrl + b - экран на страницу вверх;
ctrl + u - экран на страницу вверх;
4. Отмена действий
u - отменяет предыдущее действие. Может применяться несколько раз. Аналог комбинации ctrl + z;
ctrl + r отмена отмены предыдущего действия. Аналог комбинации ctrl + shift + z.
5. Поиск
/{regex} - поиск регулярного выражения {regex} в текущем файле от курсора к концу файла;
/{regex} - поиск регулярного выражения {regex} в текущем файле от курсора к началу файла;
n - найти следующее вхождение;
N - найти предыдущее вхождение;
f{letter} или F{letter} - перемещает курсор на следующую (или предыдущую если F) букву {letter} в текущей строке;
t{letter} или T{letter} - перемещает курсор за один символ до следующей (или предыдущей если T) буквы {letter} в текущей строке;
6. Редактирование
{NUM}dd - удаление {NUM} строк;
{NUM}cc - аналог dd, но после удаления переворит редактор в режим ввода;
{NUM}yy копирование {NUM} строк в буфер обмена;
p - вставка из буфера обмена после позиции курсора;
P - вставка из буфера обмена до позиции курсора;
x - удаление символа под курсором.
7. Пара слов о командном режиме
Можно относиться к командам vim как к предложениям.
Есть глаголы (например f, d, g), есть существительные (например w, буквы, числа).
Примеры составления предложений:
- Delete till find 'b' (удалить всё до символа 'b') - dtfb
- Mark from there to 22 line (выделить всё с текущего символа до 22 строки) - vg22g
8. Вызов внешних команд
:!cmd - вызывает shell команду cmd для обработки переданных данных. Если данных не передано, показывает вывод команды на экран.
Пример:
:!ls - показывает файлы в текущей директории
:%wc -w - считает количество слов в файле
Делаем vim hex-редактором:
%!xxd - конвертирует файл в хекс представление
%!xxd -r - конвертирует обратно
9. Прочие полезные команды
:E - Открывает меню выбора файла;
:setlocal - показывает текущие локальные переменные
10. Путешествие по тегам
Файл тегов можно создать с помощью команды
%NF ctags -R . %NE
ctrl + ] - перейти к определению тега;
ctrl + g - то же что и ctrl + ], но показывает меню выбора, если определений несколько;
ctrl + t - вернуться обратно.
11. Файл настроек vimrc
При запуске редактор считывает настройки, сохранённые в файле ~/.vimrc. Те же команды можно установить для текущей сессии vim в командном режиме после двоеточния (Пример: :set nu)
Для установки опций используется ключевое слово set, причём если мы хотим отключить опцию, то перед её именем мы пишем no
Пример:
set nu - включает нумерацию строк vim;
set nonu - выключает нумерацию;
set hls - highlight search, подсвечивает искомые слова
set ic - ignore case, игнорирует регистр букв при поиске
syntax on - включает подсветку синтаксиса
12. Справка
Vim содержит довольно полную документацию, которой можно воспользоваться в любой момент. Для её просмотра необходимо использовать команду :help. Для получения справки по интересующей команде достаточно набрать :help commandname в командном режиме. По оглавлению можно перемещаться с помощью горячих клавиш из раздела "Путешествие по тегам"
13. Полезные дополнения vimrc
Работа с файлами в windows(cp1251) кодировке
%NF set fileencodings=cp1251,utf-8 if has("x11") == 0
set enc=cp1251endif %NE
Добавление привычных комбинаций ctrl+c, ctrl+v, ctrl+a
%NF function! CopyAll?()
let n = line('.') normal gg"+yG exec nendfunction
vmap <C-c> "+y map <C-v> <esc>"+gP map <C-a> <esc>:call CopyAll?()<cr>
%NE
Мэппинг русских клавиш, для того чтобы не приходилось переключать раскладку для командного режима.
%NF .LP set langmap=йq ,цw ,уe ,кr ,еt ,нy ,гu ,шi ,щo ,зp ,фa ,ыs ,вd ,аf,пg ,рh ,оj ,лk ,дl ,яz ,чx ,сc ,мv ,иb ,тn ,ьm ,ЙQ ,ЦW ,УE ,КR ,ЕT ,НY ,ГU ,ШI ,ЩO ,ЗP ,ФA ,ЫS ,ВD ,АF ,ПG ,РH ,ОJ ,ЛK ,ДL ,ЯZ ,ЧX ,СC ,МV ,ИB ,ТN ,ЬM ,х[ ,Х{ ,ъ] ,ж\\; ,Ж: ,э' ,Э\\" ,б\\, ,Б< ,ю. ,Ю> %NE
14. Плагины
Для упрощения работы в VIM в интернете можно найти множество плагинов. Их установка довольно проста (обычно нужно просто поместить файлы в папку ~/.vim/).
Из них можно выделить
omnicppcomplete
Плагин для автодополнения имён структур, функций. Информацию о которых получается из файла тегов, который можно сгенерировать с помощью утилиты ctags.
snipmate
Плагин, содержащий в себе снипеты (короткие часто используемые куски программ, например определение функции main) для многих языков программирования. Добавить свои снипеты или изменить существующие можно в файлах .vim/snippets/*
NERDtree
Плагин отображает дерево каталогов начиная с выбранного корня. Довольно удобно для просмотра больших проектов.
15. Используемые источники
- Vim — Викиучебник / . — 2015. — http://ru.wikibooks.....
- Oualline, S. Vi iMproved (VIM) / S. Oualline. — New Riders.
- Orenstein, B. Write code faster: expert-level vim (Railsberry 2012) / B. Orenstein. — http://www.youtube.c....
Some tests
- Paradis, E. R for beginners / E. Paradis. — 2004. — http://cran.r-projec....
- Matloff, N. The Art of R Programming / Norman Matloff. — 2009.
- Lipin, B. R. The Beginner's Guide to Art of Bad Code and Ugly Style / B. R. Lipin, G. A. Sitkarev // AM&P Lab reports. — Syktyvkar : AM&P Lab Publishing, 2014. — pp. 20—28.
Ссылки на электронные ресурсы (пока просто POC):
- The Open Group Base Specifications Issue 7 [Электронный ресурс] : sed - stream editor / The IEEE and The Open Group. — IEEE Std 1003.1, 2013 Edition, 2013. — Режим доступа: http:....
Помойка с полезными ссылками:
- [http://archive.amplab.ru/history/lab-2015-01-24.log 2015-01-24T11:28:15| groff cyrillic font]
Разговор о Unix
- [http://archive.amplab.ru/history/lab-2015-03-06.log| 2015-03-06T23:09:09 Unix and Plan9]
Однострочники
- [http://archive.amplab.ru/history/lab-2015-01-16.log| 2015-01-16T07:10:26 progress bar]
- [http://archive.amplab.ru/history/lab-2015-02-03.log| 2015-02-03T14:36:29 merge files]
- [http://archive.amplab.ru/history/lab-2015-02-06.log| 2015-02-06T21:23:49 merge files ](paste)
- [http://archive.amplab.ru/history/lab-2015-02-23.log| 2015-02-23T19:41:07 ifconfig output sed]
- [http://swtch.com/~rsc/regexp/regexp2.html| Регулярные выражения. Описание как они устроены]
Книжки по типографии, которые стоит загрепать
- Гиленсон, П. Г. Справочник технического и художественного редакторов / П. Г. Гиленсон. — Москва : Книга, 1988.
- Шульмейстер, М. В. Ручной набор / М. В. Шульмейстер. — Москва : Книга, 1966.
spam
Распределение Пуассона
Нормальный закон
Где , M - Математическое ожидание; D - Дисперсия
Два вида нотаций (соглашений о записи) частного дифференцирования функций многих переменных:
Новый формат ссылок
[ya.ru|скукоживаем непонятные урлы с 02.08.15]
КатегорияЛюди