- ОС Mac OS X: подключение общих папок с помощью URL-адреса afp:// или команды mount_afp
- Дополнительная информация
- Информация для ОС Mac OS X версий 10.6–10.6.6
- Как показать полный URL-адрес веб-сайта в Safari на Mac
- Как показать полный URL-адрес веб-сайта в Safari в macOS
- Url mac os x
- Hint Options
- Личный опыт Web разработки в Mac OS X
- Web сервер
- MySQL
- FTP/SFTP
- MySQL клиент
- Sublime Text
- Ядро macOS, есть ли червячки в этом яблоке?
- Что это за проект, Apple и open-source?
- Предыдущая проверка
- Новые находки
ОС Mac OS X: подключение общих папок с помощью URL-адреса afp:// или команды mount_afp
Подключить общий том на сервере AFP можно с помощью URL-адреса типа afp://myserver.mydomain.com/Sharepoint/Folder или команды mount_afp в программе «Терминал».
Если в программе Mail.app или браузере Safari выбрать URL-адрес типа afp://myserver.mydomain.com/Sharepoint/Folder, программа Finder подключит том с именем Sharepoint на сервере AFP myserver.mydomain.com, после чего откроется окно с содержимым каталога Folder. Если перетянуть текст URL-адреса на рабочий стол, создается AFP-ссылка. Чтобы открыть эту папку, дважды щелкните ссылку.



Чтобы подключить общую папку на сервере AFP, используйте команду mount_afp в окне программы «Терминал» или shell-скрипте. Для получения дополнительной информации введите следующую команду в окне программы «Терминал»:
Дополнительная информация
Информация для ОС Mac OS X версий 10.6–10.6.6
Путь для подключения общей папки в ОС Mac OS X версий 10.6–10.6.6 отличается от используемого в других версиях Mac OS X.
URL-адрес, ведущий к файлу на сервере, (например, afp://myserver.mydomain.com/Sharepoint/Folder/File.txt) не сработает. Эта проблема решена в ОС Mac OS X 10.6.7 и более поздних версий.



Если URL-адрес или команда mount_afp в ОС Mac OS X версий 10.6–10.6.6 указывает на папку в точке подключения, такая папка подключается. В ОС Mac OS X версий 10.0–10.5 и Mac OS X 10.6.7 или более поздних (, в том числе ОС OS X Lion), устанавливается соединение с точкой подключения.
Пример: afp://myserver.mydomain.com/Sharepoint/Folder.



При открытии этой ссылки в ОС Mac OS X версий 10.0–10.5, 10.6.7 и более поздних программа Finder подключает том Sharepoint. Локальный путь к общей папке будет /Volumes/Sharepoint/Folder/.



При открытии этой ссылки в ОС Mac OS X версий 10.6–10.6.6 программа Finder подключает подкаталог Folder. Локальный путь к общей папке будет /Volumes/Folder/.
В ОС Mac OS X 10.5, 10.6.7 или более поздних версий с помощью этой команды подключается том Sharepoint в /Volumes/mntpnt. Локальный путь к общей папке будет /Volumes/mntpnt/Folder/.

В ОС Mac OS X версий 10.6–10.6.6 с помощью этой команды подключается подкаталог Folder в /Volumes/mntpnt. Локальный путь к общей папке будет /Volumes/mntpnt/.
Источник
Как показать полный URL-адрес веб-сайта в Safari на Mac
В адресной строке Safari в macOS по умолчанию отображается только доменное имя веб-сайта, на котором вы находитесь, а не полный URL-адрес, привычный для многих пользователей. Кому-то этот факт не доставляет никакого дискомфорта, а кто-то наоборот считает, что полный URL-адрес несёт важную информацию, которую хотелось бы постоянно видеть в адресной строке. О том, как показать полный URL-адрес веб-сайта в Safari на Mac читайте в этом материале.
Функция будет полезна не только разработчикам, дизайнерам, блогерам и другим лицам, чья работа так или иначе связана с браузером Safari, но и рядовым пользователям. Если вы решили вернуть адресную строку к первоначальному виду, необходимо пройти в настройки браузера Safari и сделать простейшие манипуляции.
Как показать полный URL-адрес веб-сайта в Safari в macOS
1. Откройте настройки Safari, пройдя в меню Safari → Настройки… (можно использовать сочетание клавиш ⌘Cmd + ,)
2. Перейдите на вкладку Дополнения.
3. В разделе Поле смарт-поиска поставьте галочку напротив пункта Показывать полный адрес веб-сайта.
Как только вы будете сёрфить вне главной страницы сайта, тотчас же отобразится полный URL-адрес.
Для тех, кто не желает постоянно видеть полный URL-адрес, а хочет довольствоваться этим лишь в тот момент, когда ему это нужно, существует комбинация клавиш ⌘Cmd + L по нажатию которой отобразится и выделится полный URL-адрес в браузере Safari.
Источник
Url mac os x
Creating a double-clickable web link is as simple as dragging the address from Safari to the desktop. Very convenient, unless you want to share the file with people stuck on Windows. The zero-byte .webloc file won’t make them any wiser — the address was stored in the resource fork, which means it will vanish if you try to send it to their PC.
Microsoft has their own way of creating web shortcuts, .url files. In fact, all of Windows’ Internet Explorer bookmarks are stored that way; all of them in a separate tiny file. Anyway, the format is pretty simple, nothing you can’t write in TextEdit in a few seconds: Save it as something.url and you are done. The good thing about this is that Mac OS X/Safari also supports these .url links, or does it? This had me stumped for a good while: some of my .url files would work fine and load in Safari, while some would just open an empty Safari window without loading anything, even though the same file worked properly in Windows.
Here’s the catch: don’t forget to add a closing line feed at the end. Apparently Safari is picky about that and the lack of it will result in the aforementioned empty window.
- Currently 3.20 / 5
You rated: 5 / 5 (10 votes cast)
Hint Options
Wouldn’t an applescript facilitating creating links this way in Safari be nise to post in this thread?
Now you’re talkin’, gdsimms! A drag-and-drop conversion (for .webloc -> .url) would be pretty darn handy as well.
/Library/Scripts/Applications/Safari and launch it from the script menu.
Just a refinement of the above script to rename the end file to the whole title of the page. It seems to work fine, however I am testing it to make it a little more error proof. Here is the start. Hope this helps someone
btw great idea.
Hello. Can anyone tell me what this special character. . means in an AppleScript?
I believe it allows you to take a statement that belongs on one continuous line and break it into two or more lines for readabilitie’s sake.
Thank you! I suspected it was something like that but became suspicious.
Before posting my question, while trying to search for an answer, I did stumble across the following new feature of Script Editor version 2:
* Auto-wrapping of long script statements
I was almost going to say that is seems like that option-L character is a thing of the past, but I just realized that manual line breaks will still be necessary on websites like this one (to maintain readability) so the option-L thing will probably remain.
If I can find the time, the hot ticket would be an OnMyCommand item that provides a «Save URL for PC» context menu item.
Of course it’s only useful on Cocoa browsers. Mozilla, Firebird and such only provide their own context menu items. For those (I use Firebird) you need a droplet to drag the url link onto. Applescript should be up to that challenge with a little help.
—
Mark Moorcroft
ELORET Corp. — NASA/Ames RC
Sys. Admin.
er. OK beng completey stupid how do I run applesrcipts from Safari?
Nice tip, and thanks. Now wouldn’t it would be nice if Safari created these cross-platorm compatible .url files in the first place?
Perhaps but I don’t think it’s reasonable to expect Apple to implement every single Microsoft-specific way of doing something. Especially when it isn’t an actual, industry-standard format.
Industry standard. Hmmmm.
Well, as far as I am concerned, any chance to avoid using a resource fork in OS X should be embraced. Whether the data contained in the file itself is useful on another platform or not, putting that data in the resource fork prevents it from even reaching the other platform.
Safari is emulating the behaviour of IE for Mac (yes, Microsoft decided IE for Mac should use a different URL file format, and the WAF, or Web Archive format used by IE for Mac still isn’t supported by IE for Windows, either).
I cannot agree. At least not if you are talking about IE 5.2.3 on Mac OS X. IE creates not .webloc files with URLs in their resource forks, but .url files with URLs in their data forks, preceded by «[InternetShortcut]
URL=» just as previous posts have indicated.
Which version of IE do you mean that Safari is emulating?
Netscape 7.1 for OS X, however, emulates Safari behavior by creating the same resource-based .webloc files.
IE for Windows creates the same type of .url files as IE for OS X, but with some additional data («BASEURL=» for example) that seems to be neither crucial nor detrimental to the functionality of the files regardless of on which platform they are being used.
Safari and IE for OS X both understand both .url and .webloc files, but Netscape 7.1 for Mac does not seem to comprehend .url files.
Apparently, TextEdit creates linefeeds when you hit enter. Do all OS X (or all Cocoa) programms do this? I thought Mac used to use carriage returns.
Apps in Mac OS 9 and earlier tended to use CR’s to end lines, aka Mac-style line endings. Most OS X apps, particularly those written to the Cocoa frameworks, tend to use UNIX-style line endings. I believe BBEdit Lite will let you specify either kind as well as DOS-style endings.
You are right about BBedit lite, Project builder allows it as well. But it would be nice if I could somehow check a file created with a certain app, to see what line break it is using.
I’ve figured out, that using the ‘cat filename’ command in the Terminal, shows me all file contents if linefeeds are used, and only the last line if carriage returns are used.
I use flip as mentioned in this hint.
If only I could get Mozilla to open the link instead of Safari.
Here is my version, this one keeps full length titles. the main difference is that the title is surrounded by quotes, so bash does not interpret the spaces. The other change is I have two echo statements for better readability.
try
tell application «Safari»
set theURL to URL of (document of window 1)
set theTitle to name of window 1
end tell
do shell script «echo \»[InternetShortcut]\» >
/Desktop/\»» & theTitle & «.url\»»
do shell script «echo \»URL=» & theURL & «\» >>
/Desktop/\»» & theTitle & «.url\»»
on error x
activate me
display dialog x
end try
what does «add a closing line feed at the end» mean. how do i do this?
TextEdit added too many additional formatting characters for me. However, TextWrangler, the freeware simple version of BBEdit from Bare Bones, was quick and easy.
Источник
Личный опыт Web разработки в Mac OS X
Web сервер
Apache предустановлен в Mac OS и для локальной разработки его более чем хватает.
Маленькая хитрость – если не нужен виртуальный хост, то очень помогает вот такой трюк:
Осталось кинуть проект в
/Sites/%имя_проекта% и открыть в браузере localhost/
%user_name%/%имя_проекта%
На крайний случай, если нужна полная копия production окружения всегда можно установить Vagrant.
PHP предустановлен в Mac OS. Если его версия устраивает, то просто включаем загрузку модуля php5_module:
Если не устраивает, то можно установить PHP по мануалу отсюда php-osx.liip.ch. Эта версия не заменит системную, сама найдет Apache и вообще установится в /usr/local/php5. Установка предельно проста – одна строка в консоли (пример для PHP 5.5):
MySQL
Установить MySQL можно несколькими способами, например, через Homebrew. Но компилировать из исходников MySQL только потому что это позволяет пакетный менеджер? Мне кажется что проще взять DMG архив с официального сайта и установить. После установки в Системных настройках появится вкладка MySQL:
FTP/SFTP
Кроме работы над основным проектом приходится отвлекаться и исправлять/доделывать что-то у клиентов. Обычно это чужой хостинг с доступом по FTP. Значит нужен FTP клиент. Выбор пал на Cyberduck:
Почему Cyberduck? Потому что хранит пароли в Keychain, переведен на русский, бесплатен и поддерживает FTP, SFTP, WebDAV, Amazon S3, Google Cloud Storage и Rackspace Cloud Files.
MySQL клиент
Долго выбирал рать между MySQL Workbench и Sequel Pro. В силу легкости победил Sequel Pro.
Почему локальное приложение а не phpmyadmin или mysql в консоли хостинга? Потому что все курируемые базы в одном месте и не надо при задаче «посмотри что там в базе у клиента » открывать консоль, SSH и вспоминать пароли. Да, это удаленное подключение и MySQL на хостинге смотрит наружу. Но доступ по IP или SSH туннель спасают отца русской демократии.
Возможностей у программы достаточно много, лучше почитать на официальном сайте.
Sublime Text
Без него никуда. Маленькая хитрость в настройках:
По-умолчанию выставлено в TRUE и из-за этого Cyberduck открывает новые файлы в новом окне, а не в новой вкладке существующего окна.
Кроме этого, бывает что нужно быстро запустить небольшой кусок PHP кода, а делать это в IDE не удобно. Можно выполнить PHP код из Sublime Text, добавив новую Build System (Tools –> Build System -> New):
Теперь жмем CMD + B и результат работы кода появится в консоли Sublime Text.
Это удобный сборник документации, вот его особенности:
- Автообновление документации с официальных сайтов
- Оффлайн доступ
- Шпаргалки (Cheat Sheets)
- Создание своих сниппетов
- Интеграция в PhpStorm и Sublime Text
Конечно, можно еще начать петь дифирамбы тач-жестам и полноэкранному режиму приложений, но это выходит за рамки статьи.
Источник
Ядро 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, в котором член класса сравнивался сам с собой:
Был исправлен следующим образом:
Где макрос, из которого получена переменная orglen, выглядит следующим образом:
Выходит, что анализатор оказался прав: сравнение было некорректным и должно было проводиться с переменной orglen, которая даже присутствовала в коде до исправления.
Еще один пример исправления, который я хочу привести здесь, – фрагмент N5, где знак равно всё-таки был исправлен на проверку на равенство.
Накосячить в условии assertf – одно, но ещё и перезаписать переменную для отладочной версии – такое точно стоит поправить.
Фрагменты 6 и 7 были исправлены одинаково. Оказалось, что во вложенной проверке перепутали значение перечислителя для сравнения. Вместо PBUF_TYPE_MBUF во внутренней проверке должен быть элемент PBUF_TYPE_MEMORY в обоих случаях.
В случае фрагментов N8, 9, 10 исправление было таким:
На это исправление я обратила внимание, так как серьёзная часть коммита в целом (обновление репозитория до xnu-4903.270.47 от 11 января) содержит помимо прочего много правок код-стайла. Это может указывать на то, что для данной версии кодовая база была подчищена с помощью разных инструментов качества кода. Что сделает эту проверку PVS-Studio более интересной. Ведь видно, что качество кодовой базы уже было улучшено другими инструментами.
Что касается фрагментов 11, 12, 13, 14 – был исправлен только фрагмент 11:
Остальные остались прежними. Похоже, кто-то невнимательно прочитал наш отчёт 😉 (или отчёт анализатора, использованный для улучшения качества кода в этом коммите). Приведу здесь код, на который было выдано одно из предупреждений, чтобы не было сомнений в аналогичности ошибки:
Предупреждение 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
Эта ошибка, конечно же, тоже была поправлена:
Ну и ближе к концу статьи, фрагмент 62 был исправлен так, как и было предложено в предыдущей статье. Причём это было единственной правкой в том файле.
Фрагменты 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
Предупреждение PVS-Studio: V560 A part of conditional expression is always false: index nb_dirtyoff >= bp->nb_dirtyend’ is always false. nfs_bio.c 3858
V560 A part of conditional expression is always true: (bp->nb_dirtyoff nb_dirtyend > 0) && (bp->nb_dirtyoff nb_dirtyend > end. А также осуществляется присвоение bp->nb_dirtyend = end.
Почему же третья проверка bp->nb_dirtyoff >= bp->nb_dirtyend будет всегда false?
Всё просто. Из условий выходит, что 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. Раз программист всё-таки хотел защититься от переполнения, то стоит его сделать правильно:
Таких срабатываний было несколько, стоит обратить на этот момент внимание.
- V1028 Possible overflow. Consider casting operands, not the result. vm_compressor_pager.c 1165
- V1028 Possible overflow. Consider casting operands, not the result. vm_compressor_pager.c 1131
- V1028 Possible overflow. Consider casting operands, not the result. audit_worker.c 241
- V1028 Possible overflow. Consider casting operands of the ‘((u_int32_t) slp * hz) + 999999’ operator to the ‘long’ type, not the result. tty.c 2199
Фрагмент N8
Предупреждение PVS-Studio: V1019 Compound assignment expression ‘n -= i’ is used inside condition. kern_descrip.c_99 3916
Этот код, на мой взгляд, является крайне сложночитаемым. Возможно, условие, на которое указал анализатор, стоит переписать в более простом виде:
Этот код выглядит менее эффективным, но точно является более понятным. Для быстрой проверки равнозначности эффективности этого кода можно зайти на Godbolt (Compiler Explorer), где, кстати, можно тестировать работу диагностик PVS-Studio. Анализатор легко найти среди инструментов этого сервиса.
Если не включать оптимизации, то ассемблерный код получится на пару строк больше. А вот с оптимизациями разницы уже нет никакой. Так что писать тут хитрый код нет смысла, компилятор всё сам сделает, как надо.
Но, если обратить внимание на тело этого if, новое значение n в нём не используется. То есть вполне возможно, что никакое присвоение здесь и не нужно. Тогда можно обойтись таким кодом:
И, более того, исходный код может приводить к ошибке при дальнейшем использовании переменной n. Если выражение (n -= i) tbr_last’ should be checked here. classq_subr.c 685
В проекте эта диагностика работала не лучшим образом, так как в коде постоянно над телом условия или цикла инициализировались сторонние переменные с именами, похожими на используемые в условии. Поэтому на этот раз диагностика выдала несколько явно ложных предупреждений. Но рассматриваемое нами срабатывание всё же показалось мне подозрительным, так как проверяемое поле 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++).
Потом я поняла, что есть способ попроще, и просто обратилась к .i файлу, который остался после проверки проекта. По нему строка с этим макросом развернулась следующим образом:
Больше всего здесь нас интересует вот этот участок выражения:
Никакой из операторов в выражении не является точкой следования. Так как точно неизвестно, какой из аргументов оператора | будет вычисляться первым, значение *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, которая оказалась подозрительной для анализатора после препроцессинга:
Проблема собственно та же, что и в предыдущем примере. Во внутренней цепочке с операндами | и & нет точек следования. Поэтому неизвестно, какое значение примет pf_status.stateid на моменте выполнения каждой операции. Результат также неопределён.
И, опять-таки, переменная увеличивается несколько раз подряд, что является неприятным сюрпризом от макроса :).
Вот остальные срабатывания этой диагностики на этом проекте:
- V567 Undefined behavior. The ‘ip_id’ variable is modified while being used twice between sequence points. ip_id.c 186
- V567 Undefined behavior. The ‘lp’ variable is modified while being used twice between sequence points. nfs_boot.c 505
- V567 Undefined behavior. The ‘lp’ variable is modified while being used twice between sequence points. nfs_boot.c 497
- V567 Undefined behavior. The ‘ip_id’ variable is modified while being used twice between sequence points. kdp_udp.c 588
- V567 Undefined behavior. The ‘ip_id’ variable is modified while being used twice between sequence points. kdp_udp.c 665
- V567 Undefined behavior. The ‘ip_id’ variable is modified while being used twice between sequence points. kdp_udp.c 1543
Фрагмент 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
Источник