Обновить
128K+

C++ *

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

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

Теперь PVS-Studio ещё лучше знает, что за зверь такой – strlen

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

0824_DataFlow_And_Strlen_ru/image1.png


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

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

Приёмы неблокирующего программирования: введение в compare-and-swap

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

В первой части этого цикла статей мы рассмотрели теорию, стоящую за одновременным доступом в моделях памяти, а также применение этой теории к простым чтениям и записям в память. Правда, этих примитивов оказывается недостаточны для построения высокоуровневых механизмов синхронизации вроде спинлоков, мьютексов и условных переменных. Хоть и полные барьеры памяти позволяют синхронизировать потоки с помощью приёмов, рассмотренных в предыдущей части (алгоритм Деккера), современные процессоры позволяют получить нужный эффект проще, быстрее и гибче — да, всё сразу! — с помощью операций compare-and-swap.


Для программистов ядра Linux операция обмена compare-and-swap выглядит так:


    T cmpxchg(T *ptr, T old, T new);

где T может быть либо числовым типом не больше указателя, либо указателем на что-нибудь. Так как в C нет обобщённых функций, то подобный полиморфизм реализуется макросами. cmpxchg() — это очень аккуратно реализованный макрос, который ведёт себя как функция (например, вычисляет аргументы только один раз). В Linux также есть макрос cmpxchg64(), который работает с 64-битными целыми числами и недоступен на 32-битных платформах.


cmpxchg() читает значение по указателю *ptr и, если оно равно old, то заменяет его на new. Иначе же после чтения ничего не происходит. Считанное значение возвращается как результат операции, независимо от того, произошла ли запись. И всё это выполняется атомарно: если другой поток одновременно с cmpxchg() записывает что-то по адресу *ptr, то cmpxchg() ничего не меняет. Либо old становится new, либо текущее значение остаётся нетронутым. Поэтому cmpxchg() называют атомарной операцией read-modify-write.

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

Vulkan. Руководство разработчика. Непрограммируемые стадии конвейера

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


Я работаю переводчиком в компании CG Tribe в Ижевске и здесь публикую переводы Vulkan Tutorial (оригинал — vulkan-tutorial.com) на русский язык.

Сегодня я хочу представить перевод новой главы раздела, посвященного графическому конвейеру (Graphics pipeline basics), которая называется Fixed functions.

Содержание
Читать дальше →

Современный C++ нас не спасет

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

Я часто критикую небезопасные при работе с памятью языки, в основном C и C++, и то, как они провоцируют необычайное количество уязвимостей безопасности. Моё резюме, основанное на изучении доказательств из многочисленных крупных программных проектов на С и С++, заключается в том, что нам необходимо мигрировать нашу индустрию на безопасные для памяти языки по умолчанию (такие как Rust и Swift). Один из ответов, который я часто получаю, заключается в том, что проблема не в самих С и С++, разработчики просто неправильно их готовят. В частности, я часто получаю в защиту C++ ответ типа: "C++ безопасен, если вы не используете унаследованную от C функциональность" [1] или аналогичный, что если вы используете типы и идиомы современного C++, то вы будете застрахованы от уязвимостей типа повреждения памяти, которые терзают другие проекты.

Хотелось бы отдать должное умным указателям С++, потому что они существенно помогают. К сожалению, мой опыт работы над большими С++ проектами, использующими современные идиомы, заключается в том, что этого даже близко недостаточно, чтобы остановить наплыв уязвимостей. Моя цель на оставшуюся часть этой заметки - выделить ряд совершенно современных идиом С++, которые порождают уязвимости.

Читать далее

Conan.io – неварварские методы работы

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

Всем привет!

Сегодня мы хотим поговорить о нашем опыте работы с пакетным менеджером Conan.io. Если вы так же, как и наша команда разработки Efros Config Inspector столкнулись с вопросами сборки под различные операционные системы, включая отечественные, и используете сторонние библиотеки, возможно, этот материал будет вам интересен.

Conan.io или…?


Efros Config Inspector был разработан как Windows приложение, но впоследствии было принято решение обеспечить совместимость и с отечественными ОС, такими как Astra Linux и РЕДОС. В процессе реализации этой задачи мы столкнулись с рядом трудностей, решить которые могли, во-первых, смена системы сборки программного обеспечения, во-вторых, подключение пакетного менеджера.

Разработка продукта велась на основе технологий Microsoft (Visual Studio и Team Foundation Server), но, как известно, это не самое удобное решение для сборки проекта под *.nix-системы, поэтому появились инструменты CMake. Тема выбора CMake достойна отдельной статьи. Если она вам интересна, напишите в комментариях, и мы обязательно вернемся к обсуждению данного вопроса в следующих публикациях.
Читать дальше →

Произвольное число аргументов любых типов на C11 и выше с помощью _Generic и variadic макросов

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

В Си стандарта 2011 года добавили небольшую возможность "перегрузки" функций с помощью макроса. (Generic selection) Мне, очень интересно стало написать какую-нибудь функцию, которая максимально использовала бы эту возможность

Задумка: написать (макро) функцию print, которая выводит через пробел все переданные в нее аргументы. Звучит невероятно для Си, где обычно указывают тип принимаемого аргумента одной буквой в имени, и явно указывают число переданных аргументов. Но с джейнериками из C11 это возможно

Читать далее

Самые полезные новинки C++ 20

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


В сентябре прошлого года профильный комитет ISO утвердил С++ 20 в качестве текущей версии международного стандарта. Предлагаю ознакомиться с самыми полезными и долгожданными изменениями нового стандарта.

Библиотека концепций C++


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

Книга «C++ для профи»

Время на прочтение24 мин
Охват и читатели20K
image Привет, Хаброжители! С++ — популярный язык для создания ПО. В руках увлеченного программиста С++ становится прекрасным инструментом для создания лаконичного, эффективного и читаемого кода, которым можно гордиться.

«C++ для профи» адресован программистам среднего и продвинутого уровней, вы продеретесь сквозь тернии к самому ядру С++. Часть 1 охватывает основы языка С++ — от типов и функций до жизненного цикла объектов и выражений. В части II представлена стандартная библиотека C ++ и библиотеки Boost. Вы узнаете о специальных вспомогательных классах, структурах данных и алгоритмах, а также о том, как управлять файловыми системами и создавать высокопроизводительные программы, которые обмениваются данными по сети.
Читать дальше →

Почему античитерское ПО блокирует инструменты разгона?

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

Кто из нас не пользовался читами в играх? Whosyourdaddy, thereisnospoon, hesoyam — помните? Но обращали ли вы внимание, почему, когда игрок пытается разогнать процессор или изменить настройки ПО, срабатывают некоторые программы против читеров вплоть до блокировки? Cпециально к старту нового потока курса разработчик игр на Unity, в этой статье попробуем разобраться почему инструменты мониторинга/разгона блокируются античитерским ПО. Статья будет полезна для читателей, не обладающих глубокими техническими знаниями в области использования ПО для читеров, против читеров, драйверов и того, что с ними связано.

Приятного чтения

Пишем плагин отладки для SNES игр в IDA v7

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


Приветствую,


Моя очень старая мечта сбылась — я написал модуль-отладчик, с помощью которого можно отлаживать SNES (Super Nintendo) игры прямо в IDA! Если интересно узнать, как я это сделал, "прошу под кат" (как тут принято говорить).

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

Простое сложное программирование

Время на прочтение6 мин
Охват и читатели8K
В очередной раз увидел на Хабре статью про сложное дело под названием «программирование». И то, что программирование действительно является делом не простым воспринимается как факт и обычно не требует какого либо подтверждения.

Но понятие «сложность» сродни термину «куча». Для кого-то и пять кокосов это не куча, а кого-то съел один и «больше не хочется» — значит для него и единственного кокоса будет много.

Так и со сложностью ПО. Вроде бы увеличение сложности является для всех очевидным и наблюдается во всех сферах применения IT технологий, да и сами языки программирования по мере своего развития становятся все сложнее, а вот оценивать «сложность» с помощью численных метрик — дело заведомо неблагодарное, но и «нельзя управлять тем, что невозможно измерить ...».

Обычно разговоры о «сложности» включают в себя только оценочные суждения без какой либо численной оценки. А так как лично меня интересует вопрос сложности языков программирования, то я решил посчитать сложность реализации компилятора gcc в каких нибудь условных попугаях. Вдруг можно будет увидеть какие нибудь закономерности?
Читать дальше →

Шаблоны и концепты в С++20

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

Привет, Хабр!

Недавно Егор Суворов, преподаватель курса по С++ в Питерской Вышке, прочитал лекцию о некоторых особенностях языка для участников Всероссийской олимпиады школьников по информатике. Егор рассказал о шаблонах в C++, а также где и зачем они возникают: обобщённое программирование структур данных и алгоритмов, функторы и лямбда-функции, как можно повысить уровень абстракций и упростить код.

Важное уточнение: эта лекция — не попытка объять необъятное, а краткий экскурс по полезным возможностям C++ для членов олимпиадного сообщества: от извлечения кода в класс до внутренних механизмов работы лямбда-функций и щепотки ограничений (constraints) из C++20. Если интересно, приглашаем к просмотру.

Смотреть

Печальная правда о пропуске копий в C++

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


Пропуск копий (copy elision) – это оптимизация компилятора, которая, как и следует из имени, устраняет лишние операции копирования и перемещения. Она аналогична классической оптимизации размножения копий, но выполняется конкретно для объектов C++, которые могут иметь нестандартные конструкторы копирования и перемещения. В этой статьей я продемонстрирую пример, в котором очевидная ожидаемая от компилятора оптимизация на практике не происходит.
Читать дальше →

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

Трансляция кода с C# на C++: работа портера

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

Привет, Хабр. Некоторое время назад я рассказывал о том, как нам удалось наладить ежемесячный выпуск релизов для платформы C++ (Windows и Linux) продуктов, исходный код которых получается автоматической трансляцией кода оригинальных продуктов, написанных на C#. Также я писал о том, как мы заставили такой транспилированный код выполняться в рамках нативного C++ без сборки мусора.

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

Читать далее

Как мы обошли bytenode и декомпилировали байткод Node.js (V8) в Ghidra

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

«Да я роботов по приколу изобретаю!» Рик Санчес

Многим известно, что в 2019 году АНБ решило предоставить открытый доступ к своей утилите для дизассемблирования (реверс-инжиниринга) под названием Ghidra. Эта утилита стала популярной в среде исследователей благодаря высокой «всеядности». Данный материал открывает цикл статей, посвященных плагину ghidra_nodejs для Ghidra, разработанному нашей командой (https://github.com/PositiveTechnologies/ghidra_nodejs). Задача плагина — десериализовать содержимое jsc-файлов, дизассемблировать байткод функций и декомпилировать их. В первой статье мы обсудим сущности и байткод движка V8, а также тезисно опишем сам плагин, про который подробно расскажем в последующих статьях.

Рано или поздно все сталкиваются с программами на языке JavaScript, их так и называют скриптами. JavaScript — это полноценный язык со своим стандартом ECMA Script, скрипты которого выполняются не только в браузере, но и на сервере.

Скрипты исполняются с помощью специальной программы, которую называют движком (engine) JavaScript. За годы движкостроения их понапридумывали предостаточно: V8, SpiderMonkey, Chakra, Rhino, KJS, Nashorn и т. д.

Читать далее

Свод правил по работе с целыми числами в C/C++

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

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

Релиз CLion 2021.1: глобальный анализ потоков данных, улучшения для удаленной работы, постфиксное автодополнение

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

Привет, Хабр!

В JetBrains стартовал новый релизный год: все наши десктопные продукты обновились или обновятся в самое ближайшее время. Сегодня мы хотим поговорить о CLion 2021.1 — новейшей версии нашей кроссплатформенной IDE для разработки на C и C++.

В этом обновлении много яркого и интересно

Разработка firmware на С++ словно игра в бисер. Как перестать динамически выделять память и начать жить

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

История непримиримой борьбы за повышение безопасности написанного на языке С++ микропрограммного обеспечения, против динамического выделения памяти, за пробуждение исследовательского духа в разработке, против избыточной сложности кода, за здоровую критику на ревью и здоровую самокритику, за оптимизацию потребления всех видов памяти, за образцовое содержание документации и против недооценки собственных сил и ресурсов небольших устройств на базе STM32.

Читать далее

Из первых уст. Про впечатления от курса  Яндекс Практикума “Разработчик С++”

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

Приветствую уважаемое сообщество.

В последнее время стало появляться множество курсов, связанных с IT. Вполне логично, что народ стал делиться своими наблюдениями от их прохождения. Так на Хабре можно найти отзывы об обучении на некоторых факультетах (курсах) от Яндекс Практикума [1-3]. Однако про курс "С++ разработчик" такой информации еще не было, был только рекламный пост о его запуске [4], после которого я туда и вписался, попав в первый поток (когорту).

На момент публикации большая часть курса позади, осталось пройти 3 спринта и защитить дипломный проект, поэтому есть что рассказать, как говориться, от первого лица.

Читать далее

Новый язык программирования — Relax

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

Всем привет, я являюсь автором языка программирования Relax. На данный момент я разрабатываю RVM (RelaxVirtualMachine) И Relasm (Relax Assembly). Первые попытки сделать свой язык начались в конце лета 2020, тогда я и не думал что делать язык - это так сложно. Сам же проект Relax начался 30 декабря 2020 года. Прошло полтора месяца, а на нем уже можно написать что-нибудь простенькое. RVM написана на С++ и Qt.

Читать далее