В очередной раз убедился, что программисты пишут программы совершенно безалаберно. И работают они не благодаря их заслугам, а благодаря удачному стечению обстоятельств и заботе разработчиков компиляторов в Microsoft или Intel. Да, да, именно они заботятся и в нужный момент подставляют костылики нашим кривобоким программкам.
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
Статья представляет интервью, взятое у Константина Книжника, сотрудником компании "Системы программной верификации" Андреем Карповым. Затронуты вопросы статического анализа кода, актуальность решений в этой области, а также перспективы использования статического анализа при разработке параллельных приложений.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
Статья представляет интервью, взятое у Константина Книжника, сотрудником компании "Системы программной верификации" Андреем Карповым. Затронуты вопросы статического анализа кода, актуальность решений в этой области, а также перспективы использования статического анализа при разработке параллельных приложений.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Статья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
А существуют ли в реальности 64-битные ошибки?Tatyanazaxarova
Я часто слышу в различных интерпретациях фразу "Приведенные примеры показывают не код, неправильный в плане переносимости на х64 системы, а код, неправильный сам по себе". Захотелось немного пообсуждать и пофилософствовать в блоге на эту тему. Просьба отнестись к этой записи с долей юмора.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
Я добрался до кода широко известного клиента мгновенных сообщений Miranda IM. Вместе с различными плагинами это достаточно большой проект, размер которого составляет около 950 тысяч строк кода на C и C++. И, как в любом солидном проекте с историей развития, в нем имеется немалое количество ошибок и опечаток.
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
Классическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Yandex
Антон Потапов, Intel
Стандартная библиотека С++ содержит набор наиболее распространённых контейнеров для организации данных. С++11 предоставляет минимальные гарантии безопасности работы с контейнерами в многопоточной среде, но зачастую этого недостаточно для эффективного их использования в параллельных программах. В докладе речь пойдёт о современных подходах к реализации эффективных «конкурентных» контейнеров, а также основных возникающих при этом проблемах и способах их решения.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Yandex
В докладе пойдёт речь о методе сериализации произвольных данных, который применяется в Яндексе. Этот метод основан на отображаемых в память (mmapped) файлах и не требует операции декодирования. Мы рассмотрим его преимущества и недостатки, поговорим об общих принципах такой сериализации и об устройстве отображаемых аналогов стандартных контейнеров.
Plantilla y contenido ponencia formando para pensar pensar para transformarGuillermo Molina Miranda
Este documento describe una propuesta para implementar estrategias basadas en las nuevas tecnologías con el fin de desarrollar competencias interpretativas y comprensivas del saber filosófico contextualizado en dos instituciones educativas. La propuesta busca motivar a los estudiantes a través del uso de recursos digitales como un blog, videos y una biblioteca virtual para mejorar habilidades de lectura crítica y resultados en pruebas. La metodología incluye actividades participativas con estudiantes y docentes usando estas herramientas tecnológicas.
Статья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
А существуют ли в реальности 64-битные ошибки?Tatyanazaxarova
Я часто слышу в различных интерпретациях фразу "Приведенные примеры показывают не код, неправильный в плане переносимости на х64 системы, а код, неправильный сам по себе". Захотелось немного пообсуждать и пофилософствовать в блоге на эту тему. Просьба отнестись к этой записи с долей юмора.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
Я добрался до кода широко известного клиента мгновенных сообщений Miranda IM. Вместе с различными плагинами это достаточно большой проект, размер которого составляет около 950 тысяч строк кода на C и C++. И, как в любом солидном проекте с историей развития, в нем имеется немалое количество ошибок и опечаток.
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
Классическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Yandex
Антон Потапов, Intel
Стандартная библиотека С++ содержит набор наиболее распространённых контейнеров для организации данных. С++11 предоставляет минимальные гарантии безопасности работы с контейнерами в многопоточной среде, но зачастую этого недостаточно для эффективного их использования в параллельных программах. В докладе речь пойдёт о современных подходах к реализации эффективных «конкурентных» контейнеров, а также основных возникающих при этом проблемах и способах их решения.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Yandex
В докладе пойдёт речь о методе сериализации произвольных данных, который применяется в Яндексе. Этот метод основан на отображаемых в память (mmapped) файлах и не требует операции декодирования. Мы рассмотрим его преимущества и недостатки, поговорим об общих принципах такой сериализации и об устройстве отображаемых аналогов стандартных контейнеров.
Plantilla y contenido ponencia formando para pensar pensar para transformarGuillermo Molina Miranda
Este documento describe una propuesta para implementar estrategias basadas en las nuevas tecnologías con el fin de desarrollar competencias interpretativas y comprensivas del saber filosófico contextualizado en dos instituciones educativas. La propuesta busca motivar a los estudiantes a través del uso de recursos digitales como un blog, videos y una biblioteca virtual para mejorar habilidades de lectura crítica y resultados en pruebas. La metodología incluye actividades participativas con estudiantes y docentes usando estas herramientas tecnológicas.
I own four dog breeds: pugs, which are lovable but not smart and need little space; border collies, which are protective herders that may gently herd children; Australian shepherds, also gentle herders that are easily trained and loving; and cockapoos, a smart mix between poodles and cocker spaniels that are perfect house pets and love children.
The music video for the song "Say You Don't Want It" tells a story similar to Lady and the Tramp, where a lower-class male attracts a higher-class female. Scenes of the band performing are intercut with shots that represent the surroundings and lifestyles of the audience. Mis en scene is used to represent both the run-down areas the audience lives in as well as the indie image of the band through their clothing, hair, and location of performances. Performance shots focus on individual band members to allow the audience to relate to each person's style.
Presentation highlighting advice that student affairs professionals can share with their students to help them utilize Web 2.0 technologies responsibly.
Presented at Assistant Director interview.
The author has a strong fascination with dogs and would prefer their company over people. They already have four dogs, the legal limit in their city, and wish they could have one more, ideally a Newfoundland. The author's "dog error" began when they rationalized that getting a bigger, docile breed like a Great Pyrenees would help their boxer bond with the two other dogs, despite the boxer's history of fighting and injuring the other dogs. Though their husband forbade getting another dog, the author secretly contacted a rescue society and used a friend as a reference to adopt a Great Pyrenees, traveling an hour to pick it up without permission.
Los Juegos Olímpicos son eventos deportivos internacionales que se celebran cada cuatro años en verano e invierno y están organizados por el Comité Olímpico Internacional. El símbolo olímpico consiste en cinco anillos entrelazados que representan los cinco continentes. Los niños decidieron hacer galletas con la forma de los anillos olímpicos usando harina, mantequilla, azúcar, huevo y leche. Hornearon las galletas y las decoraron con los colores olímpicos.
O documento repete várias vezes o nome "Terezinha-Bauru" e fornece um link para um site de fotos. Parece se tratar de uma apresentação ou catálogo sobre uma pessoa chamada Terezinha de Bauru.
Alejandro Heredia Zuñiga is a senior warehouse analyst and inventory analyst at UPS-SCS Colombia. He has worked there since 2006, performing tasks related to warehouse operations, inventory management, logistics planning, and safety standards. He is currently studying Logistics Management at the University Manuela Beltran and has completed courses from Sena in Supply Chain and Inventory Control.
El documento describe los roles y responsabilidades de los diferentes tipos de personal en una farmacia. El regente farmacéutico es el responsable científico y supervisor, mientras que el administrador maneja las operaciones administrativas y financieras. Los auxiliares y aprendices asisten al personal farmacéutico en el mostrador y deben cumplir con los requisitos de educación y capacitación.
This was a quick presentation for the AFP Suncoast chapter luncheon in October 2010. It describes a quick and easy visual aid to create a donor pyramid and find your mid-level donors. Also discusses matching theory with reality in your approach to fundraising for this group.
La economía vasca continuó su contracción a finales de 2012, con una caída del PIB del 1% para el año. Se prevé que el PIB vasco se contraiga aún más, un 1,5%, en el cuarto trimestre de 2012, y que la contracción continúe a una tasa del 1,2% en 2013, aunque a un ritmo más moderado en los próximos trimestres. Todos los componentes de la demanda interna, como el consumo privado y público y la inversión, están disminuyendo, mientras que la contribución del sector
la Varicela Zóster es una enfermedad altamente contagiosa, pandémica, cosmopolita que si bien es cierto puede en algunos casos presentarse de forma leve hay casos que pueden complicarse y llevar a la fatalidad. Es preciso conocer los sintomas y signos de la enfermedad para evitar complicaciones.
El documento describe los métodos de encuesta y su importancia para conocer la opinión pública, especialmente en el ámbito político. Explica que las encuestas recogen datos mediante cuestionarios aplicados a una muestra de individuos. También cubre los diferentes tipos de cuestionarios y los pasos para elaborar una encuesta.
Apresenta instruções para assistir uma apresentação multimídia, pedindo para esperar a música começar, analisar ilustrações enquanto aprecia a melodia, e pressionar ENTER para mudar de slide, mostrando cartoons premiados.
The film crew had to change locations from their originally planned location of West Rayham due to insurance costs. They found a backup location that fit their requirements and had a grungy aesthetic that suited the young band. At the new location, they were able to create different levels and shots using props like a bass drum and fan. They also got creative shots of the band members jumping and filming individual shots of each to introduce them. Additionally, they took the opportunity to get outside shots by a barn to provide variety and keep audiences interested, using the good weather to their advantage with shots of the band walking away and a low sun angle. Though it wasn't their first choice, they were ultimately able to get the performance footage they needed
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
У компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
Я занимаюсь разработкой статического анализатор кода PVS-Studio для анализа программ на языке Си/Си++. После появления в PVS-Studio 4.00 анализа общего назначения мы получили множество откликов, как положительных, так и отрицательных. Кстати, предлагаю скачать новую версию PVS-Studio, в которой благодаря откликам людей было поправлено большое количество ошибок и недочетов.
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиTatyanazaxarova
Программисты видят в стандарте C++0x возможность использовать лямбда-функции и прочие мало понятные для меня сущности :). Я увидел в нем удобные средства, позволяющие исключить многие 64-битные ошибки.
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
Методология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
При разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
После компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
Данная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Мы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.
Процессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А некоторые процессоры вообще не умеют работать с не выровненными данными.
Генерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
Важным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
Особенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Большое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
В некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Вначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
Мы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
PVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языке C/C++/C++0x. Можно выделить 3 набора правил, включенных в состав PVS-Studio:
1. Диагностика 64-битных ошибок (Viva64)
2. Диагностика параллельных ошибок (VivaMP)
3. Диагностика общего назначения
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarova
В PVS-Studio появился режим работы, который поможет максимально рано выявлять ошибки и опечатки. Анализатор запускается сразу после компиляции файлов и если что-то не так, покраснеет от стыда за ваш код. Фича доступна на данный момент только для пользователей Visual Studio 2010.
Многим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
1. Большой брат помогает тебе
Автор: Андрей Карпов
Дата: 13.08.2010
В очередной раз убедился, что программисты пишут программы совершенно безалаберно. И
работают они не благодаря их заслугам, а благодаря удачному стечению обстоятельств и заботе
разработчиков компиляторов в Microsoft или Intel. Да, да, именно они заботятся и в нужный
момент подставляют костылики нашим кривобоким программкам.
Читайте далее байтораздирающую историю про класс CString и дочь его, функцию Format.
Молитесь, молитесь на компиляторы и их разработчиков. Они столько сил прилагают, чтобы наши
программы работали, несмотря на многие недостатки и даже ошибки. Причем эта их работа
трудна и не видна. Они - благородные рыцари кодирования и ангелы-покровители для всех нас.
Я знал, что в Microsoft существует отдел, который занимается вопросами обеспечения
максимальной совместимости новых версий операционных систем со старыми приложениями. В
их базе более 10000 наиболее известных старых программ, которые должны обязательно
работать в новых версиях Windows. Именно благодаря таким усилиям я недавно смог без
проблем поиграть в Heroes of Might and Magic II (игра 1996 года) под управлением 64-битной
Windows Vista. Думаю, игра успешно запустится и в Windows 7. Вот интересные заметки Алексея
Пахунова на тему совместимости [1, 2, 3], очень рекомендую почитать.
Но видимо существуют еще и отделы, которые занимаются тем, чтобы помочь нашему ужасному
коду на Си/Си++ работать, работать и работать. Начну эту историю с самого начала.
Я участвую в разработке инструмента PVS-Studio для анализа исходного кода приложений. Тихо,
товарищи, тихо - это не реклама. В этот раз это точно богоугодное дело, ибо мы начали создавать
бесплатный статический анализатор общего назначения. Пока даже до альфа-версии далеко, но
работы потихоньку идут и когда-нибудь я сделаю про этот анализатор пост. Заговорил я об этом
потому, что мы начали собирать наиболее интересные типовые ошибки и учиться их
диагностировать.
Множество ошибок связано с использованием в программах эллипсисов. Теоретическая справка:
Существуют функции, в описании которых невозможно указать число и типы всех
допустимых параметров. Тогда список формальных параметров завершается эллипсисом (...),
что означает: "и, возможно, еще несколько аргументов". Например:
int printf(const char* ...);
Одной такой неприятной, но легко диагностируемой ошибкой является передача в функцию с
переменным количеством аргументов объекта типа класс, вместо указателя на строку. Вот как
выглядит пример этой ошибки:
wchar_t buf[100];
std::wstring ws(L"12345");
2. swprintf(buf, L"%s", ws);
Такой код приведет к формированию в буфере белиберды или к аварийному завершению
программы. В реальной программе конечно код будет более запутанный, поэтому просьба - не
надо писать комментарии о том, что в отличие от Visual C++, компилятор GCC проверит аргументы
и предупредит. Строки могут поступать из ресурсов или других функций и проверить ничего не
удастся. Здесь же диагностика проста - в функцию формирования строки передается объект
класса, что и приводит к ошибке.
Корректный вариант кода должен выглядеть так:
wchar_t buf[100];
std::wstring ws(L"12345");
swprintf(buf, L"%s", ws.c_str());
Именно из-за того, что в функции с переменным количеством аргументов можно передать все что
угодно их и не рекомендуют использовать практически во всех книгах по программированию на
языке Си++. Вместо этого предлагается использовать безопасные механизмы, например,
boost::format. Однако рекомендации рекомендациями, а кода с разными printf, sprintf,
CString::Format огромное количество и мы с ним будем жить еще очень долго. Именно поэтому
мы и реализовали диагностическое правило, выявляющее подобные опасные конструкции.
Давайте разберемся теоретически, в чем неверен приведенный выше код. Оказывается он
некорректен дважды.
1. Несоответствие аргумента заданному формату. Раз мы указываем "%s", то и передать
должны указатель на строку. Однако теоретически мы можем написать свою функцию
sprintf, которая будет знать, что ей передан объект класса std::wstring и корректно
распечатает его. Однако и это невозможно в силу причины номер 2.
2. Аргументом для эллипсиса "..." может быть только POD-тип. А std::string POD типом не
является.
Теоретическая справка про POD типы:
POD это аббревиатура от "Plain Old Data", что можно перевести как "Простые данные в стиле
Си". К POD-типам относятся:
1. все встроенные арифметические типы (включая wchar_t и bool);
2. типы, объявленные с помощью ключевого слова enum;
3. указатели;
4. POD-структуры (struct или class) и POD-объединения (union), которые удовлетворяют
нижеприведенным требованиям:
a. не содержат пользовательских конструкторов, деструктора или копирующего
оператора присваивания;
b. не имеют базовых классов;
c. не содержат виртуальных функций;
d. не содержат защищенных (protected) или закрытых (private) нестатических
членов данных;
3. e. не содержат нестатических членов данных не-POD-типов (или массивов из
таких типов), а также ссылок.
Соответственно, класс std::wstring к POD-типам не относится, так как у него есть конструкторы,
базовый класс и так далее.
При этом если вы передаете в эллипсис объект, не являющимся POD типом, то это приводит к
неопределенному поведению. Таким образом, по крайней мере, теоретически, мы никак не
можем корректно передать объект типа std::wstring в качестве эллипсис аргумента.
Та же самая картина у нас должна наблюдаться и с функций Format из класса CString.
Некорректный вариант код:
CString s;
CString arg(L"OK");
s.Format(L"Test CString: %sn", arg);
Корректный вариант кода:
s.Format(L"Test CString: %sn", arg.GetString());
Или как предлагается в MSDN [4] для получения указателя на строку можно использовать явный
оператор приведения LPCTSTR, реализованный в классе CString. Пример корректного кода из
MSDN:
CString kindOfFruit = "bananas";
int howmany = 25;
printf("You have %d %sn", howmany, (LPCTSTR)kindOfFruit);
Итак, вроде бы все прозрачно и понятно. Как сделать правило тоже ясно. Будем обнаруживать
опечатки при использовании функций с переменным количеством аргументов.
Это и было и сделано. И вот здесь я был шокирован результатом. Оказывается большинство
разработчиков вообще никогда не задумываются над этими проблемами и спокойно пишут код
вида:
class CRuleDesc
{
CString GetProtocol();
CString GetSrcIp();
CString GetDestIp();
CString GetSrcPort();
CString GetIpDesc(CString strIp);
...
5. _stprintf(acBuf, _T("%s"),
GetResString(IDS_SV_SERVERINFO));
//---------------
// Думаю понятно,
// что примеры можно приводить и приводить.
А некоторые и задумываются, но забываются. И поэтому так трогательно смотрится код
следующего вида:
CString sAddr;
CString m_sName;
CString sTo = GetNick( hContact );
sAddr.Format(_T("%smailslot%s"),
sTo, (LPCTSTR)m_sName);
И таких примеров в проектах, на которых мы тестируем PVS-Studio, оказалась столько, что стало не
понятно, как это вообще может быть. А, тем не менее, это все замечательно работает, в чем я смог
убедиться, написав тестовую программу и попробовав различные варианты использования
CString.
В чем же дело? Видимо разработчики компиляторов не выдержали бесконечных вопросов
почему программы индусов, использующие CString не работают и обвинений в "глючности
компилятора, который неверно работает со строками". И они тихо совершили священный ритуал
экзорцизма, изгнав зло из CString. Они сделали невозможное возможным. А именно класс CString
реализован специальным хитрым образом, так, чтобы его можно было передавать в функции
вида printf, Format.
Сделано это достаточно хитро и кто интересуется, то может почитать исходный код класса
CStringT, а также познакомиться с вот эти развернутым обсуждением "Pass CString to printf?" [5].
Я вдаваться в подробности не буду. Отмечу только важный момент. Специальная реализация
CString не достаточна, теоретически передача не POD-типа приводит к непредсказуемому
поведению. Так вот разработчики Visual C++, а вместе с ними и Intel C++ сделали так, что
непредсказуемое поведение представляет из себя всегда корректный результат. :) Ведь
правильная работа программы вполне себе подмножество непредсказуемого поведения. :)
А еще я теперь начинаю задумываться над некоторыми странными особенностями поведения
компилятора при построении 64-битных программ. Есть подозрение, что разработчики
компилятора сознательно делают поведение программы не теоретическим, а практическим
6. (работоспособным), в тех простых случаях, когда они распознают некоторый паттерн. Наиболее
понятным примером может быть паттерн цикла. Пример некорректного кода:
size_t n = BigValue;
for (unsigned i = 0; i < n; i++) { ... }
Теоретически, если значение n > UINT_MAX больше, то должен возникнуть бесконечный цикл.
Однако в Release версии он не возникает, так как для переменной "i" используется 64-битный
регистр. Конечно, если код будет посложнее, то бесконечный цикл возникнет, но хотя бы в ряде
случаев программе повезет. Подробнее я писал про это в статье "64-битный конь, который
умеет считать" [6].
Раньше я думал, что такое неожиданно удачное поведение программы связано исключительно с
особенностями оптимизации Release версий. Однако теперь я в этом не уверен. Возможно, это
сознательная попытка хотя бы иногда сделать неработоспособную программу работоспособной.
Конечно, я не знаю, причина в оптимизации или в заботе большого брата, но это волне повод
пофилософствовать. :) Ну а кто знает, тот вряд ли скажет. :)
Уверен, что есть и другие моменты, когда компилятор подставляет руку программам калекам.
Если попадется что-то еще интересно, обязательно расскажу.
Желаю вам безглючного кода!
Библиографический список
1. Блог Алексея Пахунова. Обратная совместимость это серьезно.
http://www.viva64.com/go.php?url=390
2. Блог Алексея Пахунова. AppCompat. http://www.viva64.com/go.php?url=391
3. Блог Алексея Пахунова. Windows 3.x жив? http://www.viva64.com/go.php?url=392
4. MSDN. CString Operations Relating to C-Style Strings. Topic: Using CString Objects with Variable
Argument Functions . http://www.viva64.com/go.php?url=393
5. Обсуждение на сайте eggheadcafe.com. Pass CString to printf?
http://www.viva64.com/go.php?url=394
6. Андрей Карпов. 64-битный конь, который умеет считать. http://www.viva64.com/art-1-1-
1064884779.html