На чем основан macos

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Mac OS

Mac OS — это сокращение от Macintosh Operating System, то есть операционная система для компьютеров Apple Macintosh. Согласно легенде, название Macintosh произошло от любимого сорта яблок Джефа Раскина, тогда ведущего разработчика Apple (на самом деле они назывались McIntosh, но эта торговая марка уже была занята).

Содержание

История

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

История версий

System 1.0 (1984)

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

System 2.0, 4.0, 5.0, 6.0 (1985-1988)

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

System 3.0

Графический интерфейс в версии Mac OS System 3.0

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

System 7.0 – 7.6 (1991-1996)

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

System 8 (1997)

Данная редакция была выпущена летом 1997 года после того, как Стив Джобс вновь присоединился к Apple. Изначально предполагалось, что новая версия продолжит традицию и выйдет под нумерацией 7.7, однако Джобс принял иное решение. В то время пользователи могли устанавливать System 7 на компьютеры других производителей. Apple решила прекратить подобную практику и перестала выпускать System 7. Именно с тех пор «яблочная» ОС устанавливается исключительно на устройства Apple. За первые две недели после выхода System 8, компания продала 1,2 млн копий, а в последующие шесть месяцев реализовала еще три миллиона. Примечательно, что System 8 претерпела лишь немногочисленные изменения. Например, компания добавила больше цветов и оттенков в элементы интерфейса и снабдила ОС новыми темами оформления и панелью управления.

Mac OS 9 (1999)

23 октября 1999 года купертиновцы выпустили версию Mac OS 9, ставшую последним обновлением классических Mac OS. Пользователи данной редакции получили возможность хранить свою информацию и устанавливать системные настройки. В числе нововведений также следует отметить появление шифрования данных по технологии Keychain, возможность работы с удаленными серверами и усовершенствованную поддержку USB-протокола. 5 декабря 2001 года состоялся релиз последнего обновления Mac OS 9.2.2.

Mac OS X 10.0 Cheetah (2000)

Особенности и преимущества

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Плюсы

Если сравнивать Mac OS с основным конкурентом ОС Windows от Microsoft, то можно выделить несколько основных отличий.

Например, интерфейс системы Mac OS X тоже имеет существенные отличия от Windows. Если в Windows каждой программе обычно соответствует одно окно с открывающимися в нем вкладками и панелями инструментов, то в Мас OS используются «плавающие» окна и панели, не привязанные к общему окну, а располагающиеся на рабочем столе.

Недостатки

Есть у Mac OS X и определенные недостатки, которые, в том числе, связаны и с достоинствами данной операционной системы.

Характеристики

Пользовательский интерфейс Mac состоит из анимированных панелей, включающих в себя иконки и значки работающих приложений и папок с документами. Кнопки Пуск здесь нет. При наведении курсора на нижний край дисплея плавно выплывает ряд кнопок и так же плавно скрывается, когда курсор отводится в сторону. В широком ранге можно кустомизировать наличие значков приложений и их привязку к разным сторонам экрана.Прежде всего, бросается в глаза ювелирная отполированность всего, что находится на экране и заметно более высокая скорость реагирования, чем на Windows. Многие пользователи Windows знакомы с Rocket Dock – это и есть подражание маковскому интерфейсу.Еще одно отличие – главная панель меню приложения всегда прикреплена к верхней части дисплея. Довольно необычно, но вскоре понимаешь, насколько это удобно.

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

В Mac OS на системном уровне решена задача запуска одновременно нескольких разных рабочих столов. Переключение горячими клавишами, ничего не глючит и не конфликтует. [Источник 4]

Заключение

ОС Mac OS устанавливался только на компьютеры Macintosh компании Apple, что является принципиальным решением ее руководства. Это не значит, что Mac OS не совместима с компьютерами других производителей и не может быть на них установлена. Установить систему конечно можно, но на данный момент это считается не законным. Компьютеры Macintosh имеют небольшой модельный ряд и не могут похвастаться разнообразием, к тому же они стоят в несколько раз дороже обычных персональных ЭВМ, поэтому число пользователей Macintosh сравнительно мало относительно общего числа компьютерных пользователей во всем мире. В 2000-х Mac OS была переименована в Mac OS X, а затем в macOS.

Источник

MacOS

Шаблон:Карточка ОС OS X Шаблон:IPA [1] (Mac OS X до версии 10.7 включительно [2] ) — проприетарная операционная система производства Apple. Является преемницей Mac OS 9.

Содержание

Описание [ ]

OS X отличается высокой устойчивостью, что делает её непохожей на предшественницу, Mac OS 9.

Основами OS X являются:

Совместимость [ ]

Программное обеспечение [ ]

Аппаратное обеспечение [ ]

Ранние версии OS X поддерживали все компьютеры Macintosh (десктопы, ноутбуки или серверы) на процессорах PowerPC G3, G4 и G5. Более поздние версии перестают поддерживать старое оборудование: например, версия 10.3 Panther не поддерживает самые старые из G3, 10.4 Tiger не поддерживает системы без FireWire, бета-версия 10.5 Leopard, представленная на WWDC, не поддерживала G3 вовсе. Однако существуют утилиты, такие как XPostFacto, и патчи к установочному диску, сделанные сторонними разработчиками, позволяющие установить новые версии OS X на официально не поддерживаемом оборудовании, включая некоторые предшествующие G3 системы. Исключая некоторые возможности, требуемые оборудованием (такие, как графическое ускорение, запись DVD ), операционная система предлагает одинаковую функциональность на всём поддерживаемом оборудовании.

Версия OS X для PowerPC остаётся совместимой со старыми Mac OS приложениями через эмуляцию так называемой Classic, которая позволяет пользователям запускать Mac OS 9 как процесс в OS X, поэтому многие старые приложения работают так, будто они запускаются на старой операционной системе. Classic не работает на компьютерах с процессорами Intel.

В апреле 2002 года eWeek сообщил, что, по слухам, у Apple есть версия OS X с кодовым названием Marklar, которая запускается на процессорах Intel x86. Идея Marklar была в переходе OS X на альтернативную платформу, которая позволит Apple преодолеть проблемы развития платформы PowerPC. Слухи оставались неподтверждёнными до мая 2005 года, когда в файлообменных сетях появилась бета-версия OS X для процессоров Intel.

Большинство программ, доступных только для PowerPC, поддерживались при помощи Rosetta. Скорость работы PowerPC-приложений на компьютерах с Intel заметно ниже. Кроме того, некоторое ПО (например, расширения ядра и плагины системных настроек) не работает с использованием эмулятора. По этим причинам Apple рекомендовала разработчикам создавать универсальные программы для обеих платформ. В OS X Lion и более поздних версиях поддержка Rosetta отсутствует.

Обратная совместимость x86-приложений на PowerPC отсутствует. Последней версией OS X, поддерживающей PowerPC, является 10.5 Leopard.

OS X была портирована на iPhone и iPod touch. Несмотря на серьёзные изменения — например, закрытость платформы и отсутствие рабочего стола (его заменяет SpringBoard) — в порте сохранились такие особенности, как Darwin и ядро XNU. В некоторых сторонних программах сохранились эффекты из настольной версии — например, в программе Converter.

Хакинтош [ ]

Особенности [ ]

Разработка для OS X [ ]

Публичное бета-тестирование [ ]

Хронология версий [ ]

Название версииНомер версииНомер сборкиДата выпуска
Public Beta1H39 или 2E14 [18]13 сентября 2000
10.0 Cheetah10.04K7824 марта 2001
10.0.14L1314 апреля 2001
10.0.24P121 мая 2001
10.0.34P139 мая 2001
10.0.44Q1221 июня 2001
10.1 Puma10.15G6425 сентября 2001
10.1.15M2812 ноября 2001
10.1.25P4821 декабря 2001
10.1.35Q4519 февраля 2002
10.1.45Q12517 апреля 2002
10.1.55S605 июня 2002
10.2 Jaguar10.26C11524 августа 2002
10.2.1 Red6D5218 сентября 2002
10.2.2 Blue6F2111 ноября 2002
10.2.3 Green6G3019 декабря 2002
10.2.4 Pink6I3213 февраля 2003
10.2.5 Plaid6L2910 апреля 2003
10.2.6 Black6L606 мая 2003
10.2.76R6522 сентября 2003
10.2.86R73 (G4)3 октября 2003
6S90 (G5)
10.3 Panther10.37B8524 октября 2003
10.3.17C10710 ноября 2003
10.3.27D2417 декабря 2003
10.3.37F4415 марта 2004
10.3.47H6326 мая 2004
10.3.57M349 августа 2004
10.3.67R285 ноября 2004
10.3.77S21515 декабря 2004
10.3.87U169 февраля 2005
10.3.97W9815 апреля 2005
10.4 Tiger10.48A42829 апреля 2005
10.4.18B1516 мая 2005
10.4.28C4612 июля 2005
10.4.38F4631 октября 2005
10.4.48G3210 января 2005
10.4.58H14 (PowerPC)14 февраля 2005
8G1454 (Intel)
10.4.68I1119 (PowerPC)3 апреля 2006
7U16 (Intel)
10.4.78J135 (PowerPC)27 июня 2006
8J2135 (Intel)
10.4.88L127 (PowerPC)29 сентября 2006
8L2127 (Intel)
10.4.98P135 (PowerPC)13 марта 2007
8P2137 (Intel)
10.4.108R218 (PowerPC)20 июня 2007
8R2218 (Intel)
10.4.118S165 (PowerPC)14 ноября 2007
8S2167 (Intel)
10.5 Leopard10.59A58126 октября 2007
10.5.19B1815 ноября 2007
10.5.29C3111 февраля 2008
10.5.39D3428 мая 2008
10.5.49E171 июля 2008
10.5.59F3316 сентября 2008
10.5.69G5515 декабря 2008
10.5.79J6112 мая 2009
10.5.89L305 августа 2009
10.6 Snow Leopard10.610A43228 августа 2009
10.6.110B50410 сентября 2009
10.6.210C5409 ноября 2009
10.6.310D57329 марта 2010
10.6.410F56916 июня 2010
10.6.510H54812 ноября 2010
10.6.610J5676 января 2011
10.6.710J86921 марта 2011
10.6.810K54023 июля 2011
10.7 Lion10.711A51120 июля 2011
10.7.111B21116 августа 2011
10.7.211C7412 октября 2011
10.7.311D501 февраля 2012
10.7.411E539 мая 2012
10.7.511G5619 сентября 2012
10.8 Mountain Lion10.812A26925 июля 2012
10.8.112B1923 августа 2012
10.8.212C5419 сентября 2012
12C6012 октября 2012
10.8.312D7814 марта 2013
10.8.412E5524 мая 2013
10.8.512F3713 сентября 2013
12F424 октября 2013
10.9 Mavericks10.913A60322 октября 2013
10.9.113B4216 декабря 2013
10.9.213C6425 февраля 2014
10.9.313D6515 мая 2014
10.9.413E2830 июня 2014
10.9.513F3417 сентября 2014
10.10 Yosemite10.1014A38916 октября 2014
10.10.114B2517 ноября 2014
10.10.214C10928 января 2015
10.10.314D1368 апреля 2015
10.10.414E4630 июня 2015
10.10.514F2713 августа 2015
10.11 El Capitan
10.1115A28430 сентября 2015
10.11.115B4221 октября 2015
10.11.215C508 декабря 2015
10.11.315D2119 декабря 2015
10.11.415E6521 марта 2016
10.11.515F3416 мая 2016 [19]

OS X Server [ ]

Номер версииДата выпуска
1.016 марта 1999
10.021 мая 2000
10.125 сентября 2001
10.224 августа 2002
10.324 октября 2003
Mac OS X Server 10.429 апреля 2005
10.525 октября 2007
10.628 сентября 2009
10.720 июля 2011
10.825 июля 2012
OS X Server 3.0 (Mavericks)23 октября 2013
OS X Server 4.0 (Yosemite)16 октября 2014
OS X Server 4.1 (Yosemite)8 апреля 2015
30 сентября 2015 года

Примечания [ ]

Литература [ ]

Ссылки [ ]

Шаблон:Операционные системы Apple inc. Шаблон:Навигационная таблица Шаблон:Mach-like Шаблон:UNIX-like

Источник

Ядро macOS, есть ли червячки в этом яблоке?

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

В самом начале этого года Apple выложили в открытый доступ исходный код системных компонентов macOS 11.0 – Big Sur, включая XNU – ядро операционной системы macOS. Пару лет назад исходный код ядра уже проверялся PVS-Studio в связи с выходом анализатора для macOS. Прошло достаточно много времени, и вышел новый релиз исходного кода ядра. Почему бы и не провести повторную проверку.

Что это за проект, Apple и open-source?

XNU – X is Not Unix – используется и разрабатывается Apple в качестве ядра операционных систем OS X. Исходные коды этого ядра 20 лет назад были опубликованы под лицензией APSL (Apple Public Source License) вместе с OC Darwin. Раньше Darwin можно было даже установить в качестве полноценной операционной системы, однако теперь это стало невозможно. Причиной публикации исходного кода является тот факт, что он во многом основан на других open-source проектах.

Исходные коды компонентов можно найти тут. Для проверки я использовала зеркало проекта на GitHub.

Предыдущая проверка

Как я уже упомянула, этот проект ранее проверялся нами с помощью PVS-Studio. С предыдущими результатами можно познакомиться в статье: «Релиз PVS-Studio для macOS: 64 weaknesses в Apple XNU Kernel». После публикации мой коллега Святослав также отправил статью разработчикам на почту, но ответа не получил. Так что я предполагаю, что наша проверка никак не связана с исправлениями, которые мы дальше рассмотрим. Разработчикам пришлось искать их другим путём. А могли бы просто взять и запустить PVS-Studio :). Сейчас, после публикации статей, мы в основном пишем об этом в GitHub репозиторий проекта.

Мне стало интересно, были ли исправлены ошибки, описанные в предыдущей статье, или всё так и осталось. Большинство из найденных ошибок действительно были исправлены. Это показывает, что отобранные предупреждения анализатора оказались верными. Хотя для написания статьи с отчётом работал человек, не участвующий в разработке XNU, то есть близко не знакомый с этим исходным кодом.

Я приведу здесь несколько примеров исправлений. Но, чтобы не раздувать объём статьи, не буду полностью приводить объяснение ошибок. Если из исправления будет неясно, в чём была проблема, то вы всегда можете обратиться к первой статье по проверке этого проекта. Я не буду разбирать все исправленные фрагменты, большинство из фрагментов всё-таки было поправлено. А фрагментов в предыдущей статье было ни много ни мало 64!

Перейдём к рассмотрению исправлений примеров из прошлой статьи.

Фрагмент N1, в котором член класса сравнивался сам с собой:

Был исправлен следующим образом:

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Где макрос, из которого получена переменная orglen, выглядит следующим образом:

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

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

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Накосячить в условии assertf – одно, но ещё и перезаписать переменную для отладочной версии – такое точно стоит поправить.

Фрагменты 6 и 7 были исправлены одинаково. Оказалось, что во вложенной проверке перепутали значение перечислителя для сравнения. Вместо PBUF_TYPE_MBUF во внутренней проверке должен быть элемент PBUF_TYPE_MEMORY в обоих случаях.

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

В случае фрагментов N8, 9, 10 исправление было таким:

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

На это исправление я обратила внимание, так как серьёзная часть коммита в целом (обновление репозитория до xnu-4903.270.47 от 11 января) содержит помимо прочего много правок код-стайла. Это может указывать на то, что для данной версии кодовая база была подчищена с помощью разных инструментов качества кода. Что сделает эту проверку PVS-Studio более интересной. Ведь видно, что качество кодовой базы уже было улучшено другими инструментами.

Что касается фрагментов 11, 12, 13, 14 – был исправлен только фрагмент 11:

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Остальные остались прежними. Похоже, кто-то невнимательно прочитал наш отчёт 😉 (или отчёт анализатора, использованный для улучшения качества кода в этом коммите). Приведу здесь код, на который было выдано одно из предупреждений, чтобы не было сомнений в аналогичности ошибки:

Предупреждение PVS-Studio: V612 An unconditional ‘return’ within a loop. kern_credential.c 951

Я привела код почти целиком, чтобы можно было сформировать общее представление о том, что происходит в этой функции. В случае отмеченного цикла при выполнении условия входа в него будет совершён один проход по телу цикла, завершающийся возвращением error. Видимо, подразумевалось, что если выполняется условие (workp = TAILQ_FIRST(. )) == NULL, то нужно найти причину ошибки и завершить функцию возвращением информации об ошибке. Однако по какой-то причине вместо if был написан while, как и во фрагменте из предыдущей статьи. Строчка error = msleep0(. ) выглядит в коде таким образом:

Здесь последним аргументом передаётся указатель на функцию kauth_resolver_getwork_continue. В теле этой функции есть условие, аналогичное условию цикла, на который нам указал анализатор. Но в нём уже корректно используется if, а не while.

В принципе этот код работает немного сложнее, чем я описала. В нём присутствует рекурсия (в методе kauth_resolver_getwork_continue), и, как я поняла, он нацелен на нахождение потоков, которые можно перезагрузить. Но я не стала вдаваться в подробности, так как while всё равно лишний. Возможно, он остался здесь с того времени, когда исходный код выполнял ту же задачу, но без использования рекурсии.

Это примеры из начала статьи. Проскочим в середину и возьмём фрагмент N40. В нём одному и тому же элементу дважды присваивается одно значение:

Предупреждение PVS-Studio: V519 CWE-563 The ‘wrap.Seal_Alg[0]’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 2070, 2071. gss_krb5_mech.c 2071

Эта ошибка, конечно же, тоже была поправлена:

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Ну и ближе к концу статьи, фрагмент 62 был исправлен так, как и было предложено в предыдущей статье. Причём это было единственной правкой в том файле.

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Фрагменты 63 и 64 также были исправлены, но там код был изменён капитально. Поэтому понять, какое исправление было именно для рассмотренного предупреждения, сложно.

Новые находки

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

К этой проверке cloc насчитал в проекте 1346 *.c файлов, 1822 С/C++ хэдера и 225 *.cpp файлов.

Ну и перейдём к разбору интересных находок.

Фрагмент N1

Предупреждение PVS-Studio: V1064 The ‘gPEClockFrequencyInfo.bus_clock_rate_hz’ operand of integer division is less than the ‘gPEClockFrequencyInfo.dec_clock_rate_hz’ one. The result will always be zero. pe_identify_machine.c 72

Все используемые здесь поля имеют целочисленный тип:

Через промежуточные присвоения полю gPEClockFrequencyInfo.bus_clock_rate_hz, являющемуся делимым, присваивается значение 100000000, а полю-делителю gPEClockFrequencyInfo.dec_clock_rate_hz присваивается значение 1000000000. Делитель в этом случае в десять раз больше делимого. Так как все поля здесь являются целочисленными, поле gPEClockFrequencyInfo.bus_to_dec_rate_den окажется равным 0.

Судя по наименованию результирующего поля bus_to_dec_rate_den, делитель и делимое были перепутаны местами. Я допускаю возможность, что код был написан с расчётом на то, что исходные значения изменятся и результат уже не будет равен 0. Но этот код всё равно кажется мне очень подозрительным.

Фрагмент N2

Предупреждение PVS-Studio: V614 Uninitialized variable ‘best’ used. sdt.c 572

Насколько я поняла, этот метод ищет название некоей функции. В алгоритме используется переменная best, возможно, это положение наилучшего кандидата на результат. Однако изначально эта переменная только объявляется без инициализации. Следующее же использование сверяет значение некоего элемента с переменной best, которая будет неинициализированной на тот момент. Еще страннее, что она инициализируется только внутри условия, в котором используется её же значение.

Неинициализированные переменные могут приводить к непредсказуемым результатам. И, хотя эта ошибка может показаться достаточно банальной, она всё ещё часто встречается при проверках разных проектов с помощью PVS-Studio. Например, совсем недавно мой коллега Андрей описывал интересный случай такой ошибки.

Фрагмент N3

Почему же третья проверка bp->nb_dirtyoff >= bp->nb_dirtyend будет всегда false?

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Всё просто. Из условий выходит, что nb_dirtyoff меньше, чем end, а nb_dirtyend равно end. В итоге nb_dirtyend точно больше, чем nb_dirtyoff. Присвоение bp->nb_dirtyoff = bp->nb_dirtyend = 0 никогда не будет выполнено.

В итоге вот такой участок кода:

Можно упростить хотя бы до такого:

Но только если в настоящий момент этот алгоритм работает корректно.

Второе предупреждение указывает на четвёртый if, вложенный в первый.

Здесь анализатор выдаёт предупреждение на основании того, что присвоение нуля никогда не будет выполнено. В итоге во внешнем условии уже была проверка bp->nb_dirtyoff t_rawq.c_cc + tp->t_canq.c_cc’ statement is a part of the condition. Perhaps, this statement should have been compared with something else. tty.c 568

Аналогичный случай. Тут повыше в коде снова есть проверка, которая не просто использует сумму, а сравнивает результат с другой переменной:

В упрощённом коде условие, на которое указал анализатор, выглядит заметно. Но в оригинале оно было вложено в несколько if. Так что при код-ревью такое можно и пропустить, а анализатор не пропустит 😉

Фрагмент N7

Предупреждение PVS-Studio: V1028 Possible overflow. Consider casting operands of the ‘amount + used’ operator to the ‘size_t’ type, not the result. kpi_mbuf.c

Снова ошибка в условии, но уже совсем другого рода. Вместо приведения к size_t операндов сложения, чтобы результат точно поместился в числовой тип, к size_t приводится результат сложения. Если в итоге сложения возникнет переполнение, то с результатом mbuf_maxlen(m) будет сравниваться бессмысленное значение, приведённое к size_t. Раз программист всё-таки хотел защититься от переполнения, то стоит его сделать правильно:

Таких срабатываний было несколько, стоит обратить на этот момент внимание.

Фрагмент N8

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

Этот код выглядит менее эффективным, но точно является более понятным. Для быстрой проверки равнозначности эффективности этого кода можно зайти на Godbolt (Compiler Explorer), где, кстати, можно тестировать работу диагностик PVS-Studio. Анализатор легко найти среди инструментов этого сервиса.

Если не включать оптимизации, то ассемблерный код получится на пару строк больше. А вот с оптимизациями разницы уже нет никакой. Так что писать тут хитрый код нет смысла, компилятор всё сам сделает, как надо.

Но, если обратить внимание на тело этого if, новое значение n в нём не используется. То есть вполне возможно, что никакое присвоение здесь и не нужно. Тогда можно обойтись таким кодом:

В проекте эта диагностика работала не лучшим образом, так как в коде постоянно над телом условия или цикла инициализировались сторонние переменные с именами, похожими на используемые в условии. Поэтому на этот раз диагностика выдала несколько явно ложных предупреждений. Но рассматриваемое нами срабатывание всё же показалось мне подозрительным, так как проверяемое поле tbr_rate не использовалось в теле условия и было инициализировано на 35 строк выше этой проверки. А вот поле tbr_last, инициализированное прямо перед этой проверкой, больше нигде не используется. Можно предположить, что проверить нужно было его вместо tbr_rate.

Фрагмент N11

Предупреждение PVS-Studio: V571 Recurring check. The ‘if (ar->k_ar.ar_arg_mac_string == NULL)’ condition was already verified in line 245. audit_mac.c 246

Предупреждение PVS-Studio: V547 Expression ‘ar->k_ar.ar_arg_mac_string == NULL’ is always true. audit_mac.c 246

На этот код анализатор выдал сразу два предупреждения.

Сначала взгляд может зацепиться за то, что проверка в самом первом if и во втором совпадает. Но тут всё правильно: внутри тела первой проверки аллоцируется память, а для второй проверки есть пояснение:

Судя по этому комментарию, во второй проверке не должно быть никакой внутренней проверки. Нужно просто выйти из метода. Так что, скорее всего, внутренняя проверка была продублирована случайно и не имеет никакого смысла.

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

Фрагмент N12

Предупреждение PVS-Studio: V567 Undefined behavior. The ‘ucsp’ variable is modified while being used twice between sequence points. vfs_utfconv.c 298

Макросы – очень коварная штука. Возможно, вы даже уже встречались с нашей статьей «Вред макросов для C++ кода». Я обычно при написании статей избегаю срабатываний на макросы. С ними всегда всё оказывается сложно без знакомства с кодовой базой проекта.

Но в случае этой ошибки всё оказалось чуть проще. Хотя, чтобы дойти до причины и развернуть цепочку макросов, пришлось прыгнуть в ту ещё кроличью нору. Собственно, цепочка эта начинается с выражения OSSwapInt16(*ucsp++).

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Больше всего здесь нас интересует вот этот участок выражения:

Никакой из операторов в выражении не является точкой следования. Так как точно неизвестно, какой из аргументов оператора | будет вычисляться первым, значение *uscp оказывается неопределённым.

Для диагностики V567 PVS-Studio предоставляет крайне подробную документацию. Если вам интересно, почему такой код может приводить к неопределённому поведению, документация может стать хорошим началом изучения этой проблемы.

Однако это ещё не всё! Есть очень интересный и важный момент. Готова поспорить, что человек, писавший этот код, планировал увеличить значение *ucsp только один раз. Но, на самом деле, значение увеличится дважды. Это не видно и непонятно. Макросы очень и очень опасны из-за вот таких случаев. Во многих ситуациях лучше написать обыкновенную функцию. Скорее всего, компилятор автоматически выполнит подстановку и никакого ухудшения производительности не произойдёт.

Фрагмент N13

Предупреждение PVS-Studio: V567 Undefined behavior. The ‘pf_status.stateid’ variable is modified while being used twice between sequence points. pf.c 1440

И снова коварные макросы смешали все карты для инкремента. Рассмотрим строку с вызовом htobe64, которая оказалась подозрительной для анализатора после препроцессинга:

На чем основан macos. Смотреть фото На чем основан macos. Смотреть картинку На чем основан macos. Картинка про На чем основан macos. Фото На чем основан macos

Проблема собственно та же, что и в предыдущем примере. Во внутренней цепочке с операндами | и & нет точек следования. Поэтому неизвестно, какое значение примет pf_status.stateid на моменте выполнения каждой операции. Результат также неопределён.

И, опять-таки, переменная увеличивается несколько раз подряд, что является неприятным сюрпризом от макроса :).

Вот остальные срабатывания этой диагностики на этом проекте:

Фрагмент N14

Предупреждение PVS-Studio: V519 The ‘uh->uh_sport’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 4866, 4870. ipsec.c 4870

В этом фрагменте возникла подозрительная ситуация: полю uh_sport в зависимости от определённого условия присваиваются разные значения. Однако сразу после if-else этому же полю снова присваивается значение, такое же как в ветке else. В итоге этот if-else блок теряет смысл, так как значение поля всё равно будет перезаписано.

Фрагмент N15

Предупреждение PVS-Studio: V547 Expression ‘(value & (1ULL

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *