неопределённое поведение

  • ХабрахабрФото Си должен умереть

    Си должен умереть

    Язык Си - один из наиболее влиятельных языков программирования за всю историю. Он стал незаменимым инструментом разработки операционных систем, сместив с этого пьедестала языки ассемблера. Изучение Си обязательно для любого уважающего себя программиста. Этот язык любим за свою внешнюю простоту и ненавидим за беспощадность к ошибкам. Благодаря нему у нас есть ядро Linux и тысячи уязвимостей в нём же в…

    Читать далее »
  • ХабрахабрФото Исследование одного неопределённого поведения

    Исследование одного неопределённого поведения

    В статье исследуются возможные проявления неопределённого поведения, возникающего в c++ при завершении не-void функции без вызова return с подходящим значением. Статья носит больше научно-развлекательный характер, чем практический.Кому не нравится весело скакать по граблям — проходим мимо, не задерживаемся. Введение Всем известно, что при разработке c++-кода следует не допускать неопределённого поведения.Однако:— неопределённое поведение может казаться не достаточно опасным из-за абстрактности возможных…

    Читать далее »
  • ХабрахабрФото Неопределённое поведение с устаревшими объявлениями функций в ANSI C

    Неопределённое поведение с устаревшими объявлениями функций в ANSI C

    Прототипы были введены с целью устранить недостатки, которыми обладают обычные объявления функций. Стандарт ANSI C определяет понятие прототипа функции, представляющее собой подмножество объявления функции, которое указывает типы входных параметров. Таким образом, указание списка типов параметров в круглых скобках прототипа функции обязательно, иначе такое выражение будет признаваться компилятором как устаревшее объявление функции, что может привести к неоднозначным ситуациям, описанным в данной…

    Читать далее »
  • ХабрахабрФото Магические трансформации типов данных в Rust: Интринсика mem::transmute<T, U>

    Магические трансформации типов данных в Rust: Интринсика mem::transmute<T, U>

    Язык программирования Rust, невзирая на всеохватывающую идеологию безопасности данных, располагает и небезопасными методиками программирования, ведь порой они могут повышать скорость путём устранения лишних вычислений, а порой это просто жизненная необходимость. Одной из них является наш сегодняшний экземпляр — интринсика mem::transmute<T, U>, предназначенная для того и другого понемногу, пригождаясь в крайне необычных ситтуациях. Она попросту реинтерпретирует биты одного типа данных как…

    Читать далее »
  • ХабрахабрФото [Перевод] Неопределённое поведение и правда не определено

    [Перевод] Неопределённое поведение и правда не определено

    Термином «неопределённое поведение» в языке C и C++ обозначают ситуацию, в которой буквально «чего только не бывает». Исторически, к неопределённому поведению относили случаи, когда прежние компиляторы для C (и архитектуры на нём) вели себя несовместимым образом, и комитет по разработке стандарта, в своей безграничной мудрости, решил ничего не решать по этому поводу (т.е. не отдавать предпочтение какой-то одной из конкурирующих…

    Читать далее »
  • ХабрахабрФото [Из песочницы] C++: сеанс спонтанной археологии и почему не стоит использовать вариативные функции в стиле C

    [Из песочницы] C++: сеанс спонтанной археологии и почему не стоит использовать вариативные функции в стиле C

    Началось все, как водится, с ошибки. Я первый раз работал с Java Native Interface и делал в C++ части обертку над функцией, создающей Java объект. Эта функция — CallVoidMethod — вариативна, т.е. помимо указателя на среду JNI, указателя на тип создаваемого объекта и идентификатора вызываемого метода (в данном случае конструктора), она принимает произвольное число других аргументов. Что логично, т.к. эти…

    Читать далее »
  • ХабрахабрФото [Перевод] Почему перенос при целочисленном переполнении — не очень хорошая идея

    [Перевод] Почему перенос при целочисленном переполнении — не очень хорошая идея

    Эта статья посвящена неопределённому поведению и оптимизациям компилятора, особенно в контексте знакового целочисленного переполнения. Существует математический термин "перенос", который близок к описываемому явлению, а термин "флаг переноса" (carry flag) — механизм выставления флага в процессорах при целочисленном переполнении. Примечание от переводчика: в русском языке нет четкого соответствия в употребляемом контексте слова «wrap»/«wrapping». Она лучше отображает смысл «wrap» по сравнению с…

    Читать далее »
  • ХабрахабрФото [Перевод] Как обезопасить C

    [Перевод] Как обезопасить C

    Один из разработчиков ядра Linux рассказал, как справиться с уязвимостями безопасности С. Язык C очень мощный и много где используется — особенно в ядре Linux — но при этом очень опасный. Код C очень быстр, но несётся без ремней безопасности. Вы можете сделать практически любую вещь на С, но это не значит, что её нужно делать. Даже если вы эксперт, как большинство…

    Читать далее »
  • ХабрахабрФото [Перевод] Чего из Rust мне не хватает в C

    [Перевод] Чего из Rust мне не хватает в C

    Об авторе. Федерико Мена-Кинтеро — мексиканский программист, один из основателей проекта GNOME, автор книги «Язык программирования Rust». Librsvg достиг переломного момента: внезапно выясняется, что легче портировать некоторые основные части из C на Rust, чем просто добавить аксессоры. Кроме того, всё больше «мяса» библиотеки сейчас написано на Rust. Сейчас мне приходится часто переключаться между двумя языками, и C теперь выглядит очень, очень…

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


Кнопка «Наверх»