Обновить
233.19

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Статический анализ кода C++

Время на прочтение5 мин
Охват и читатели34K
Для меня красота C++ заключается, в первую очередь, во вседозволенности и ужасающей мощи языка. Мы можем работать с памятью так же плотно, как и в C, и в то же время имеем такие средства абстракции, как шаблоны и STL, где параметризовать можно что угодно и чем угодно.
Плата за это соответствующая — не всегда вразумительные ошибки компилятора (попробуйте забыть поставить точку с запятой после определения класса), очень большой срок подготовки и обучения программистов, но самое главное — некоторые баги становятся заметными только во время исполнения программы.
Мы хотим больше полезных ворнингов до запуска наших программ. Одно из средств получения желаемого — статический анализ кода. Статический — значит, не запуская программу. Интересны не только вероятные ошибки, случаи undefined behaviour, утечки памяти, но и вещи вроде недоступности/неиспользуемости кода, рекомендации по повышению интуитивности стиля программирования.
Читать дальше →

Многопоточность, общие данные и мьютексы

Время на прочтение5 мин
Охват и читатели59K

Введение


При написании многопоточных приложений почти всегда требуется работать с общими данными, одновременное изменение которых может привести к очень неприятным последствиям.

Для блокировки общих данных от одновременного доступа необходимо использовать объекты синхронизации.

В данном топике рассмотренна методика работы с мютексами, существенно уменьшающая количество потенциальных ошибок связанных с созданием/удалением и захватом/освобождением.

Неудаление мютекса приводит к утечке памяти, незахват — к некорректным данным, а неосвобождение — к блокировке всех функций, работающих с общими данными.

Ниже рассматривается работа с мютексами в Windows и Unix, подобная идея может быть использована при работе с другими объектами синхронизации.

Эта идея является частным случаем методики «Выделение ресурса — есть инициализация (RAII)».

Далее

Поисковая система по C++ ресурсам

Время на прочтение2 мин
Охват и читатели7.1K
Не самый популярный, но оттого не менее полезный сервис Google — возможность создать свою поисковую систему. Технология простая — вы отбираете сайты, в которых поисковик будет искать прежде всего, сужая, таким образом область поиска и получая красивые релевантные результаты.
Мне захотелось найти поисковик для C++, но я ничего полезного не увидел. Зашел на Google Custom Search, накидал список сайтов (штук 15, не больше) и увидел, что это хорошо — ищет уже гораздо лучше стандартного гугл-поиска. Вот ссылка на эту мини-искалку. Буду рад, если хабрасиплюсплюсеры помогут мне в развитии и пополнении списка допустимых сайтов. Тут есть следующие варианты:
  • "ха! дык это ведь уже есть!" вы тыкаете меня носом в уже созданный тематический поисковик по C++, я посыпаю голову пеплом, закрываю топик и радостно этим поисковиком пользуюсь,
  • "ура, мы создадим СВОЙ поисковик, с функторами и аллокаторами". Тут видится два разумных варианта. Первый — я раздаю 100 инвайтов желающим присоединиться к наполнению базы сайтов поисковика и они непосредственно включаются в редактирование. Или же можно содать общедоступную и свободно редактируемую страничку (да хоть эту), на которую сваливать все ссылки. Ну а страничка в качестве источника ссылок будет съедаться гуглом.
  • также принимаются предложения по смене системы создания custom search, идеи о том, как можно подключать штуки вроде закладок delicious (или, например, ), помеченных соответствующими тегами, страниц MSDN, URL которых никак не связан с темой, и прочее.
Пока добавлены следующие ресурсы

STL Filter — скрипт для лаконичных ошибок STL

Время на прочтение3 мин
Охват и читатели1.8K
STL славится своей способностью заполнять метры экранного пространства сообщениями об ошибках. Надоело смотреть на экран и видеть перлы вроде:

testmap.cpp:25: error: no matching function for call to ‘std::map<int, double, std::less, std::allocator<std::pair<const int, double> > >::map(int, int, int)’
/usr/include/c++/4.3/bits/stl_map.h:175: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = int, _Tp = double, _Compare = std::less, _Alloc = std::allocator<std::pair<const int, double> >]
/usr/include/c++/4.3/bits/stl_map.h:165: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const _Alloc&) [with _Key = int, _Tp = double, _Compare = std::less, _Alloc = std::allocator<std::pair<const int, double> >]


ну и еще пара десятков строк.

Читать дальше →

DLL Injection

Время на прочтение4 мин
Охват и читатели73K
DLL инъекция дает возможность выполнять свой код в адресном пространстве уже запущенного процесса. Многие используют инфицирования для написания читов для игр, выполнения вредоносных действий для системы и т.п. Но данный прием не обязательно применять для реализации коварных планов, а например, для обновления своего приложения.
Читать дальше →

Использование Skype API в С++

Время на прочтение3 мин
Охват и читатели23K
Не так давно понадобилась написать приложение которое бы автоматически отправляло сообщение по Skype определенному пользователю, который есть в списке контактов. Задача была не много сложнее, но дело не в этом. Решил написать маленькую статейку по использованию Skype API.
Читать дальше →

как вы относитесь к гипертрофированному СИ?

Время на прочтение1 мин
Охват и читатели957
const int AllocAccountType_ACCOUNT_IS_CARRIED_ON_NON_CUSTOMER_SIDE_OF_BOOKS_AND_IS_CROSS_MARGINED = 6;
const char ClearingFeeIndicator_FULL_AND_ASSOCIATE_MEMBER_TRADING_FOR_OWN_ACCOUNT_AND_AS_FLOOR_BROKER[] = "F";


и так 2634 строки заголовочного файла с одними константами.

вот такое API приходится ковырять иногда. Есть еще примеры позлее?

P.s
Опубликовано по просьбе JohnWest

Создание своего Windows Service

Время на прочтение7 мин
Охват и читатели90K
Я решил провести один эксперимент, суть его пока не могу разглашать, но по результатам обязательно опишу его))) Для этого эксперимента, мне нужно написать приложение которое работает как сервис в Windows.
Читать дальше →

Задачка (без злого умысла)

Время на прочтение1 мин
Охват и читатели3.6K
Нужно заменить ровно один (любой) символ в следующей строке, причём так, чтобы она скомпилилась и было выведено ровно 20 звёздочек:
int main() { int i, n = 20; for (i = 0; i < n; i--) { printf("*"); } }

* This source code was highlighted with Source Code Highlighter.

Для тех, кто «набил руку» на особенностях C, задачка, скорее всего, сложности не представляет; но существует как минимум 3 решения, и если вы нашли одно — то это не повод расслабиться :) А может быть, вы найдёте ещё четвёртое, пятое..?
UPD 1: Первое правильное решение предложил lostmsu, остальные два — steck
Не читайте комменты, поломайте мозг!

решения

Использование OpenMP для распараллеливания вычислений

Время на прочтение5 мин
Охват и читатели59K
Есть задача — восстановить пароль по его MD5 хэшу. Пароль простой, состоит из 7 цифр и начинается с 8-ки. Оговорюсь сразу — пароль мой, я его банально забыл, и это не инструкция о том, как брутфорсить чужие пароли.

Программа должна работать в несколько потоков для максимально быстрого достижения результата. Хотя бы потому, что запускать я ее буду на компьютере с двухъядерным процессором. Один поток не сможет максимально использовать оба ядра.

Рассмотрим два способа: создание нескольких рабочих потоков и использование OpenMP

Читать дальше →

Функция без явного определения

Время на прочтение1 мин
Охват и читатели1.6K
Изучаю C++. Балуясь с указателями придумал интересный для себя пример. Вероятно, опытных людей он не заинтересует, но я все же рискну.
typedef int (*pf)(int, int);
char c[] = {85,-119,-27,-117,69,12,3,69,8,93,-61,-112};
pf sum = (pf)c; //reinterpret_cast здесь не работает.
cout << sum(2,3); //Вывод 5.


* This source code was highlighted with Source Code Highlighter.
Теперь sum — функция сложения, являющаяся аналогом этой:
int sum(int a, int b){return a+b;}

Единственное полезное применение которое я могу придумать — пугать опасностью подобных приведений.

UPD. Как мне подсказал iley, это в общем-то относится к C.

UPD. Одной строкой:
cout << ((int (*)(int, int))"\x55\x89\xE5\x8B\x45\x0C\x03\x45\x08\x5D\xC3")(2,3)
(спасибо 0lympian за мысль и halyavin за поправку)

Использование Direct2D и DirectWrite в .Net-среде

Время на прочтение7 мин
Охват и читатели11K
Несмотря что «нагуглить» в интернете можно все, для новых технологий это далеко не так. В частности, когда я захотел использовать достаточно новые технологии Direct2D (не бойтесь, это никак не связано с DirectX 7) и DirectWrite в своем .Net-приложении, то столкнулся с проблемой что примеров взаимодействия этих библиотек и .Net нет. Поэтому пришлось самому покопаться.
Upd.: переношу в C++ т.к. дотнетчикам явно не интересно.

Читать дальше →

Мой защищённый контейнер

Время на прочтение3 мин
Охват и читатели3.1K
При разработке проекта на C++ возникла необходимость создать защищённый контейнер. Вернее, кросс-платформенные на уровне исходного кода классы, поддерживающие защищённое хранение информации от нескольких байт до гигабайтов, что делает необходимым поддержку потокового шифрования/дешифрования.
Не имея альтернативы нанять на данном этапе профессионального криптографа, приступил к созданию велосипеда.
Данная статья написана для открытого обсуждения предлагаемых решений людьми, близкими к криптографии, а также для тех, кто будет проходить этот путь с нуля, как экономия их времени и сил.
Читать дальше →

Ближайшие события

С++0x и решение проблем инициализации

Время на прочтение3 мин
Охват и читатели3.3K
C++0xВ статьях на хабре уже касались стандарта С++0x, а в частности лямбда-выражений. Я хотел написать еще про пару изменений и дополнений, которые внесут в С++. И без лишних слов сразу к делу.

Читать далее..

Неочевидная особенность в синтаксисе определения переменных

Время на прочтение3 мин
Охват и читатели6.9K
Предлагается совершенно невинный на вид кусок кода на C++. Здесь нет ни шаблонов, ни виртуальных функций, ни наследования, но создатели этого чудесного языка спрятали грабли посреди чистa поля.

struct A {
  A (int i) {}
};

struct B {
  B (A a) {}
};

int main () {
  int i = 1;
  B b(A(i)); // (1)
  return 0;
}


* This source code was highlighted with Source Code Highlighter.


Вопрос: какой тип у переменной b? Совсем не тот, который можно было бы предположить на первый взгляд.

Ответ под катом

Boost это просто. Часть 2. Boost.Date_time

Время на прочтение15 мин
Охват и читатели40K
Как вы уже поняли, в данной статье речь пойдет о библиотеке Boost.Date_Time. Библиотеке по работе со временем.
 
 
 

В статье мы рассмотрим следующие части библиотеки:

  • Gregorian
  • Posix Time
  • Local Time


Читать дальше →

Один символ ценой в уязвимость

Время на прочтение1 мин
Охват и читатели1.8K
Возможно, многие в курсе про недавнюю узявимость в ActiveX компоненте MSVidCtl, которая потенциально могла позволить злоумышленнику выполнить произвольный код используя переполнение буфера. Недавно, в блоге посвященному практике SDL появилось описание ошибки программиста, которая привела к уязвимости защиты.

Ошибка заключается в одном символе, вместо правильного кода:
hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.

программист написал
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.

использование лишнего символа & (получение адреса) привело к тому, что злоумышленник получил возможность произвести удаленное переполнение буфера с известными последствиями.

Подробнее про эту ошибку, почему ее пропустили и что будет сделано, чтобы подобные ошибки больше не появлялись, можно почитать в блоге там же есть описание и другой ошибки связанной с ATL.

C++0x (С++11). Лямбда-выражения

Время на прочтение13 мин
Охват и читатели309K
Буквально на днях случайно наткнулся на Хабре на статью о лямбда-выражениях из нового (будущего) стандарта C++. Статья хорошая и даёт понять преимущества лямбда-выражений, однако, мне показалось, что статья недостаточно полная, поэтому я решил попробовать более детально изложить материал.

Читать дальше

Лямбда выражения теперь и в С++

Время на прочтение3 мин
Охват и читатели43K
image
Многие языки программирования позволяют создавать налету локальные не именованные функции внутри выражений. К этим языкам относятся C#3.0, Python, ECMAScript и практически все функциональные языки программирования (например, Haskell и Scheme). Такие функции обычно относят к лямбда функциям, которые имеют широкое применение.
Читать дальше →

Виртуальный конструктор

Время на прочтение6 мин
Охват и читатели70K
Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор, который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method). Однако мы можем сделать «ход конем» и сымитировать поведение виртуального конструктора с помощью методики, называемой «конверт и письмо» («Letter/Envelope»).

Читать дальше

Вклад авторов