Обновить
261.61

C++ *

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

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

Неопределенное поведение в C++

Время на прочтение9 мин
Охват и читатели69K
Достаточно сложной темой для программистов на С++ является undefined behavior. Даже опытные разработчики зачастую не могут четко сформулировать причины его возникновения. Статья призвана внести чуть больше ясности в этот вопрос.

Статья является ПЕРЕВОДОМ нескольких статей и выдержек из Стандарта по данной теме.

Что такое «точки следования»?

Стандарте сказано:
Точки следования (sequence points)– такие точки в процессе выполнения программы, в которых все побочные эффекты уже выполненного кода закончили свое действие, а побочные эффекты кода, подлежащего исполнению, еще не начали действовать. (§1.9/7)


Побочные эффекты? А что такое «побочные эффекты»?

Побочный эффект (side effect) (согласно Стандарту) – результат доступа к volatile объекту, изменения объекта, вызова функции из библиотеки I/O или же вызова функции, включающей в себя какие-то из этих действий. Побочный эффект является изменением состояния среды выполнения.

Вычисление некоторого выражения дает на выходе какой-то результат. Если же в дополнение к результату вычисление выражения вызывает изменения в среде выполнения, то говорят, что данное выражение имеет побочные эффекты.

Например:
Читать дальше →

Веб-приложение на C++, или укрощение демона FastCGI

Время на прочтение8 мин
Охват и читатели27K
В настоящее время, благодаря таким инструментам как NodeJS, создание веб-приложения — сущий пустяк. Скачал бинарник, сваял js в 5 строчек кода и можно хвастаться. А если подключить express и добавить ещё 5 строчек, то получим полноценное веб-приложение с роутингом, шаблонами, сессиями и другими прелестями. Так просто, что даже скучно. И стало мне интересно: как обстоят дела у моего старого знакомого С++, с которым уже 5 лет не виделся. В своё время прельстил меня ActionScript и прочий JavaScript, а о добром друге, который не раз выручал, совсем позабыл. В свете недавних статей о Configurable Omnipotent Custom Applications Integrated Network Engine (сокращено Cocaine), попался мне на глаза проект под названием Fastcgi Daemon, на основе которого функционирует HTTP-интерфейс Cocaine. И так, знакомьтесь
Читать дальше →

Lock-free структуры данных. Эволюция стека

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

В предыдущих своих заметках я описал основу, на которой строятся lock-free структуры данных, и базовые алгоритмы управления временем жизни элементов lock-free структур данных. Это была прелюдия к описанию собственно lock-free контейнеров. Но далее я столкнулся с проблемой: как построить дальнейший рассказ? Просто описывать известные мне алгоритмы? Это довольно скучно: много [псевдо-]кода, обилие деталей, важных, конечно, но весьма специфических. В конце концов, это есть в опубликованных работах, на которые я даю ссылки, и в гораздо более подробном и строгом изложении. Мне же хотелось рассказать интересно об интересных вещах, показать пути развития подходов к конструированию конкурентных контейнеров.
Хорошо, — подумал я, — тогда метод изложения должен быть такой: берем какой-то тип контейнера — очередь, map, hash map, — и делаем обзор известных на сегодняшний день оригинальных алгоритмов для этого типа контейнера. С чего начать? И тут я вспомнил о самой простой структуре данных — о стеке.
Читать дальше →

Единорог заинтересовался микромиром

Время на прочтение10 мин
Охват и читатели10K
PVS-Studio and μManager (Micro-Manager)
В этот раз интересные примеры ошибок нам преподнёс микромир. Мы проверили с помощью анализатора кода PVS-Studio открытый проект μManager. Это программный пакет для автоматизированного получения изображения с микроскопа.
Читать дальше →

C++11 и 64-битные ошибки

Время на прочтение11 мин
Охват и читатели35K
CryEngine 3 SDK and PVS-Studio
Мы решили сделать небольшую паузу в тематике статического анализа кода. Ведь блог C++ читают и те, кто пока еще не использует эту технологию. А между тем в мире C++ происходят явления, которые оказывают влияния на такую «устоявщуюся» тему, как 64-битный мир. Речь идет о том как стандарт C++11 влияет и помогает (если есть чем) в разработке корректных 64-битных программ. Сегодняшняя статья как раз об этом.
Читать дальше →

Objective-c блоки и c++ лямбды

Время на прочтение10 мин
Охват и читатели25K
Надеюсь, что пост будет полезен людям которые знакомы с лямбдами C++, но хотят изучить блоки Objective-C и наоборот.
Здесь я постарался описать синтаксис замыканий, механизмы захвата контекста, управление памятью и взаимодествие лямбд и блоков между собой.
Во всех примерах использовался Apple LLVM Compiler 4.2 (Clang). Для приведенного Obj-C кода не используется ARC, т.к я придерживаюсь мнения, что необходимо знать как работает non-ARC код, чтобы понять как работает ARC.
Читать дальше →

Сравнение анализаторов кода: CppCat, Cppcheck, PVS-Studio, Visual Studio

Время на прочтение3 мин
Охват и читатели25K
Авторы: Евгений Рыжков (EvgeniyRyzhkov), Андрей Карпов (Andrey2008), Павел Еремеев (Paull), Святослав Размыслов (svyatoslavmc).

CppCat vs PVS-Studio vs Cppcheck vs Visual Studio

Мы провели подробное сравнение четырёх анализаторов Си/Си++ кода: CppCat, Cppcheck, PVS-Studio и статический анализатор, встроенный в Visual Studio 2013. Это серьезное исследование, на которое нами было потрачено около 170 человеко-часов и которое, на наш взгляд, хорошо отражает картину, существующую на данный момент.
Читать дальше →

С++ для Perl программистов

Время на прочтение1 мин
Охват и читатели5.5K
Есть старая шутка, что программист на фортране будет писать на фортране на любом языке программирования.

Вот программа на 3 строки, которая компилируется любым C++11 компилятором, после этого нормально запускается и работает.
int main(){
    return !<:]()<%;[=:>(){<:&](){;%>();%>();};
}


Пример в Online IDE
В принципе эту строку можно использовать как детектор на C++ программистов — не все сразу могут понять как это работает.
Читать дальше →

Множественный выбор в QComboBox

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

Картинка для привлечения внимания
(возможно имеющая отношение к посту)


Иногда, довольно удобным бывает возможность множественного выбора в виджете QComboBox. В этом небольшом туториале будет показано, как это cделать.
Ближе к коду

Побочный результат: проверяем CryEngine 3 SDK с помощью PVS-Studio

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

Мы закончили сравнивать статические анализаторы кода Cppcheck, PVS-Studio и анализатор встроенный в Visual Studio 2013. В ходе этого было проверено более 10 открытых проектов. И про некоторые из них можно написать статьи. Вот очередная такая статья о результатах проверки проекта CryEngine 3 SDK.
Читать дальше →

Как работают сигналы и слоты в Qt (часть 2)

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


От переводчика: это вторая часть перевода статьи Olivier Goffart о внутренней архитектуре сигналов и слотов в Qt 5, перевод первой части тут.
Читать дальше →

Method chaining

Время на прочтение2 мин
Охват и читатели25K
В этом посте я поговорю о простом, но иногда полезном приеме программирования — method chaining. Также расскажу про потенциальный подводный камень, связанный с его использованием
Читать дальше →

Создание и использование плагина для Clang в Xcode

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

Данный туториал описывает создание плагина для Clang и покрывает следующие шаги:


  • настройка окружения
  • создание базового плагина
  • создание Xcode-проекта для разработки плагина
  • генерирование предупреждений
  • генерирование ошибок
  • интеграция плагина в Xcode
  • интерактивные подсказки по устранению предупреждений и ошибок


TL;DR

Готовый плагин можно найти здесь
Читать дальше →

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

Как работают сигналы и слоты в Qt (часть 1)

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


Qt хорошо известен своим механизмом сигналов и слотов. Но как это работает? В этом посте мы исследуем внутренности QObject и QMetaObject и раскроем их работу за кадром. Я буду давать примеры Qt5 кода, иногда отредактированные для краткости и добавления форматирования.
Читать дальше →

Сколько стоит одна ошибка в наших программах, или какие ошибки бывают в PVS-Studio и CppCat

Время на прочтение5 мин
Охват и читатели23K
Найдена ошибка в PVS-Studiuo и CppCat В списке вопросов, которые всегда задают нам после прочтения наших статей есть вопрос: «А вы проверяете код своего анализатора им самим?». И дается ответ в том ключе, что у нас всегда проверяется код во время написания с помощью режима инкрементального анализа (проверки файлов сразу после компиляции). А также запускаются ночные проверки для всего кода. И в связи с этим мы, к сожалению (ирония), никогда не сможем написать статью про ошибки в наших программных продуктах.

Однако сегодня – именно статья про одну нашу ошибку и про то, сколько она нам стоила. Заинтриговал?

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

Плагин поиска дублирующегося кода для QtCreator

Время на прочтение9 мин
Охват и читатели8.7K
image

Дублирующийся код осложняет внесение изменений, понимание исходных текстов и их дальнейшее сопровождение. Для того, чтобы избежать дублирования, а также для оценки качества кода и его рефакторинга, в составе некоторых IDE есть встроенные средства для поиска повторяющихся фрагментов кода. Для других IDE написаны плагины. Однако для среды разработки QtCreator до настоящего момента ни встроенных средств, ни плагинов поиска повторов не было.
В статье описывается два решения задачи автоматического поиска дубликатов в данной IDE: с помощью средства интеграции сторонних утилит и с помощью разработанного плагина, который надеюсь будет полезен программистам C++, использующим QtCreator.
Читать дальше →

Баги реализации стандарта С++11 в Visual Studio 2012, которые были исправлены в Visual Studio 2013

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

В этой статье будет рассмотрен ряд багов в реализации стандарта С++11, которые имелись в Visual Studio 2012 и были исправлены в Visual Studio 2013. Таким образом мы теперь можем использовать С++11 так, как в теории предполагается его использовать. Если для обхода багов VS2012 вам пришлось понаписывать «костылей» — теперь их можно убрать.

К сожалению, не все баги были исправлены, кое-что мигрировало из VS2012 в VS2013, а также появились новые баги. Под катом вы найдёте детальный разбор текущего состояния дел.
Читать дальше →

Box2d: анатомия коллизий

Время на прочтение10 мин
Охват и читатели39K
Что такое коллизии?

В Box2D принято считать, что друг с другом сталкиваются тела, однако на самом деле при расчете коллизий используются фикстуры (fixtures, переводы слова существуют, но я не уверен, есть ли среди них устоявшийся). Объекты могут сталкиваться разными способами, поэтому библиотека предоставляет большое количество уточняющей информации, которая может быть использована в игровой логике. Например, вы можете захотеть узнать следующее:

  • Когда столкновение начинается и заканчивается
  • Точку соприкосновения фикстур
  • Вектор нормали к линии контакта фикстур
  • Какая энергия была приложена и результат коллизии

Обычно столкновение происходит очень быстро, однако в этой статье мы попытаемся взять одну конкретную коллизию и замедлить ее, чтобы успеть рассмотреть детали происходящего и информацию, которую можно извлечь из события.
Читать дальше →

Побочный результат: проверяем Firebird с помощью PVS-Studio

Время на прочтение7 мин
Охват и читатели14K
Firebird and PVS-Studio
Сейчас мы заняты большой задачей. Мы хотим провести сравнение четырёх анализаторов кода: Cppcheck, PVS-Studio и Visual Studio 2013 (встроенный анализатор кода). Для этого мы решили проверить не менее 10 открытых проектов и проанализировать отчёты, которые выдадут анализаторы. Это очень трудоёмкая задача и пока она не завершена. Но так как ряд проектов уже проверен, то про некоторые из них можно написать статьи. Чем я сейчас и займусь. Для начала опишу, что интересного удалось найти с помощью PVS-Studio в Firebird.
Читать дальше →

Кроссплатформенный сервер с неблокирующими сокетами. Часть 4

Время на прочтение8 мин
Охват и читатели22K
Эта статья продолжает мои предыдущие:
Простейший кросcплатформенный сервер с поддержкой ssl
Кроссплатформенный https сервер с неблокирующими сокетами
Кроссплатформенный https сервер с неблокирующими сокетами. Часть 2
Кроссплатформенный https сервер с неблокирующими сокетами. Часть 3

В своих статьях я поэтапно расписываю процесс создания однопоточного кроссплатформенного сервера на неблокирующих сокетах.
Во всех предыдущих статьях, сервер принимал и отправлял сообщения только по ssl протоколу. В этой статье я опишу добавление в сервер поддержки обычного нешифрованного tcp протокола и научу сервер отправлять в браузер графический файл.
Но сначала немного пройдусь по комментариям к предыдущим статьям.
Читать дальше →

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