SlideShare a Scribd company logo
1 of 2
Download to read offline
А существуют ли в реальности 64-
битные ошибки?
Автор: Андрей Карпов

Дата: 08.11.2009

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

Во-первых, можно начать с того, что любой код, написанный на Си++, уже неправильный сам по
себе. Правильным будет только код, состоящий из пустой функции main, и то я не уверен.
Невозможно написать идеальную корректную программу на Си/Си++. Ведь надо учесть, что
программа должна работать на 12-, 16-, 32-, 64-, ...-битной системе. Программа, по возможности,
не должна динамически выделять память, так как кое-где ее очень мало. Еще надо, чтобы в ней
не использовались функции типа scanf, ведь программу может понадобиться поместить в
контроллер, где нет устройства ввода. В программе не должно использоваться приведение типов.
Любое приведение типа, это потенциально какая-то ошибка на какой-то платформе. Еще
возможно лучше писать программу с помощью триграфов. А то вдруг...



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

Итак, любой код неправилен сам по себе с точки зрения идеального программиста с золотыми
руками, находящегося в вакууме. Но можно считать, что определенный код корректен при
определенных условиях. При изменении условий (окружения) код может становиться
некорректен. В чем он становится некорректен - зависит от внешних изменений. Поиск возникших
ошибок при смене среды исполнения, можно собрать в группу и успешно диагностировать. В то
время как подход "в программе все неправильно" не рационален.

Рассмотрим пример. Имеем программу, переносимую в контроллер, который не будет иметь
консоли. В программе есть некоторое количество cout, cin, printf, scanf. Необходимо найти эти
функции и "обезвредить". Допустим, осуществляться ввод будет через порты, подсоединенные к
какой-нибудь ручке на ящике прибора. Не имеет смысла говорить, что код плох, что программист,
писавший его, плох, раз он сразу не предусмотрел, что консоли может не быть и единым
движением нельзя отключить все эти места. Это нам не поможет. И нет смысла заниматься
идеальным рефакторингом для создания идеальной программы. Надо просто найти и поправить
нужные места. Можно придумать статический анализатор в духе диагностики "проблем ввода-
вывода в контроллерах". И он будет полезен! Хотя, если по-честному, конечно все из-за
неидеального кода.
Пример выше сильно натянут, но просто хочется продемонстрировать, что когда человек пишет
код, он не может предусмотреть все. Не знает он, что его код через 5 лет будет засовываться в
контроллер, переноситься на 64-битную систему или адаптироваться для подводной лодки.
Предусмотреть что-то заранее весьма непросто.

Программисты имеют и поддерживают такой код, какой у них есть. В нем может быть полно
магических чисел, ТЫСЯЧИ выражений, где вместе используются знаковые и беззнаковые типы,
могут быть отключены многие предупреждения, из-за необходимости использования БОЛЬШИХ
старых сторонних библиотек. И заниматься полномасштабным рефакторингом таких проектов,
чтобы они стали красивее, переносимее и так далее, никто не будет. А того кто будет настаивать -
пожалуй, начальству следует уволить.



В реальном мире надо решать реальные задачи. Надо добавлять новую функциональность,
поддерживать работоспособность на существующих системах. Если понадобится - перенести код
на 64 бита. Но при переносе кода на 64-битную систему, будет решаться именно эта задача, а не
как сделать код максимально переносимым. И вот здесь возникает практическая задача найти
определенные магические числа (но не все), найти опасные выражения со знаковыми и
беззнаковыми типами (но не все).

Моя позиция покажется многим неверной, как будто я призываю писать плохой код, а затем
призываю использовать различные костыли (которые сам и продаю), чтобы его местами
подправить. Я просто практик. И еще я называю многие вещи своими именами.



В большинстве своем код программ ПЛОХ. И более или менее работает, потому, что ему везет. К
сожалению, программисты упорно не хотят это признавать. Любая "встряска кода" (смена
компилятора, среды исполнения и так далее) вскрывает пласт определенных типов ошибок. Я
понимаю, что нет "64-битных" ошибок. Есть просто ошибки в коде. Они всегда есть. Но
определенные ошибки проявят себя именно на 64-битной системе. Я рассказываю о таких
ошибках и надеюсь это полезно разработчикам. И именно такие ошибки я называю "64-битные
ошибки".

More Related Content

What's hot

Amusing Geometry in Test Automation
Amusing Geometry in Test AutomationAmusing Geometry in Test Automation
Amusing Geometry in Test AutomationÞorgeir Ingvarsson
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROITatyanazaxarova
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternÞorgeir Ingvarsson
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Pavel Chertorogov
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентовNikolay Samokhvalov
 
Демонизированный PHP - before it was cool
Демонизированный PHP - before it was coolДемонизированный PHP - before it was cool
Демонизированный PHP - before it was coolAndrey Tokarchuk
 
dont badmouth mojo
dont badmouth mojodont badmouth mojo
dont badmouth mojoAnton Ukolov
 
How to Calculate Test Automation ROI
How to Calculate Test Automation ROIHow to Calculate Test Automation ROI
How to Calculate Test Automation ROIÞorgeir Ingvarsson
 

What's hot (11)

Amusing Geometry in Test Automation
Amusing Geometry in Test AutomationAmusing Geometry in Test Automation
Amusing Geometry in Test Automation
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROI
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" Pattern
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
Демонизированный PHP - before it was cool
Демонизированный PHP - before it was coolДемонизированный PHP - before it was cool
Демонизированный PHP - before it was cool
 
dont badmouth mojo
dont badmouth mojodont badmouth mojo
dont badmouth mojo
 
Php and frameworks
Php and frameworksPhp and frameworks
Php and frameworks
 
How to Calculate Test Automation ROI
How to Calculate Test Automation ROIHow to Calculate Test Automation ROI
How to Calculate Test Automation ROI
 

Similar to А существуют ли в реальности 64-битные ошибки?

Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
 
Безопасность 64-битного кода
Безопасность 64-битного кодаБезопасность 64-битного кода
Безопасность 64-битного кодаTatyanazaxarova
 
60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
Programmers' Mistakes for Dummies
Programmers' Mistakes for DummiesProgrammers' Mistakes for Dummies
Programmers' Mistakes for DummiesCOTOHA
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»Sigma Software
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Презентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьПрезентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьDmitriy Polisadov
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияTatyanazaxarova
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программTatyanazaxarova
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!Tatyanazaxarova
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
2013-03-02 02 Дмитрий Пашкевич. Код на стероидах
2013-03-02 02 Дмитрий Пашкевич. Код на стероидах2013-03-02 02 Дмитрий Пашкевич. Код на стероидах
2013-03-02 02 Дмитрий Пашкевич. Код на стероидахОмские ИТ-субботники
 

Similar to А существуют ли в реальности 64-битные ошибки? (20)

Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Безопасность 64-битного кода
Безопасность 64-битного кодаБезопасность 64-битного кода
Безопасность 64-битного кода
 
60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
Programmers' Mistakes for Dummies
Programmers' Mistakes for DummiesProgrammers' Mistakes for Dummies
Programmers' Mistakes for Dummies
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»
Володимир Дем’яненко, «How to become a Test Automation Engineer. My way»
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Презентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начатьПрезентация: 1С-Bitrix — как начать
Презентация: 1С-Bitrix — как начать
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 
Это сложно
Это сложноЭто сложно
Это сложно
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программ
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработке
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
2013-03-02 02 Дмитрий Пашкевич. Код на стероидах
2013-03-02 02 Дмитрий Пашкевич. Код на стероидах2013-03-02 02 Дмитрий Пашкевич. Код на стероидах
2013-03-02 02 Дмитрий Пашкевич. Код на стероидах
 

More from Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 

More from Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 

А существуют ли в реальности 64-битные ошибки?

  • 1. А существуют ли в реальности 64- битные ошибки? Автор: Андрей Карпов Дата: 08.11.2009 Я часто слышу в различных интерпретациях фразу "Приведенные примеры показывают не код, неправильный в плане переносимости на х64 системы, а код, неправильный сам по себе". Захотелось немного пообсуждать и пофилософствовать в блоге на эту тему. Просьба отнестись к этой записи с долей юмора. Во-первых, можно начать с того, что любой код, написанный на Си++, уже неправильный сам по себе. Правильным будет только код, состоящий из пустой функции main, и то я не уверен. Невозможно написать идеальную корректную программу на Си/Си++. Ведь надо учесть, что программа должна работать на 12-, 16-, 32-, 64-, ...-битной системе. Программа, по возможности, не должна динамически выделять память, так как кое-где ее очень мало. Еще надо, чтобы в ней не использовались функции типа scanf, ведь программу может понадобиться поместить в контроллер, где нет устройства ввода. В программе не должно использоваться приведение типов. Любое приведение типа, это потенциально какая-то ошибка на какой-то платформе. Еще возможно лучше писать программу с помощью триграфов. А то вдруг... В общем, я к тому, что идеально верных программ на Си/Си++ не бывает. Можно стремиться, но сделать такую программу нельзя. В реальном мире при написании программ выбирают какой-то приемлемый уровень корректности и предположения об окружающей среде исполнения и в рамках этой модели пишут программу. Итак, любой код неправилен сам по себе с точки зрения идеального программиста с золотыми руками, находящегося в вакууме. Но можно считать, что определенный код корректен при определенных условиях. При изменении условий (окружения) код может становиться некорректен. В чем он становится некорректен - зависит от внешних изменений. Поиск возникших ошибок при смене среды исполнения, можно собрать в группу и успешно диагностировать. В то время как подход "в программе все неправильно" не рационален. Рассмотрим пример. Имеем программу, переносимую в контроллер, который не будет иметь консоли. В программе есть некоторое количество cout, cin, printf, scanf. Необходимо найти эти функции и "обезвредить". Допустим, осуществляться ввод будет через порты, подсоединенные к какой-нибудь ручке на ящике прибора. Не имеет смысла говорить, что код плох, что программист, писавший его, плох, раз он сразу не предусмотрел, что консоли может не быть и единым движением нельзя отключить все эти места. Это нам не поможет. И нет смысла заниматься идеальным рефакторингом для создания идеальной программы. Надо просто найти и поправить нужные места. Можно придумать статический анализатор в духе диагностики "проблем ввода- вывода в контроллерах". И он будет полезен! Хотя, если по-честному, конечно все из-за неидеального кода.
  • 2. Пример выше сильно натянут, но просто хочется продемонстрировать, что когда человек пишет код, он не может предусмотреть все. Не знает он, что его код через 5 лет будет засовываться в контроллер, переноситься на 64-битную систему или адаптироваться для подводной лодки. Предусмотреть что-то заранее весьма непросто. Программисты имеют и поддерживают такой код, какой у них есть. В нем может быть полно магических чисел, ТЫСЯЧИ выражений, где вместе используются знаковые и беззнаковые типы, могут быть отключены многие предупреждения, из-за необходимости использования БОЛЬШИХ старых сторонних библиотек. И заниматься полномасштабным рефакторингом таких проектов, чтобы они стали красивее, переносимее и так далее, никто не будет. А того кто будет настаивать - пожалуй, начальству следует уволить. В реальном мире надо решать реальные задачи. Надо добавлять новую функциональность, поддерживать работоспособность на существующих системах. Если понадобится - перенести код на 64 бита. Но при переносе кода на 64-битную систему, будет решаться именно эта задача, а не как сделать код максимально переносимым. И вот здесь возникает практическая задача найти определенные магические числа (но не все), найти опасные выражения со знаковыми и беззнаковыми типами (но не все). Моя позиция покажется многим неверной, как будто я призываю писать плохой код, а затем призываю использовать различные костыли (которые сам и продаю), чтобы его местами подправить. Я просто практик. И еще я называю многие вещи своими именами. В большинстве своем код программ ПЛОХ. И более или менее работает, потому, что ему везет. К сожалению, программисты упорно не хотят это признавать. Любая "встряска кода" (смена компилятора, среды исполнения и так далее) вскрывает пласт определенных типов ошибок. Я понимаю, что нет "64-битных" ошибок. Есть просто ошибки в коде. Они всегда есть. Но определенные ошибки проявят себя именно на 64-битной системе. Я рассказываю о таких ошибках и надеюсь это полезно разработчикам. И именно такие ошибки я называю "64-битные ошибки".