﻿# 64\-битные ошибки здесь

Как человек, неравнодушный к 64\-битным ошибкам, я решил написать маленький комментарий к статье "Buggy Security Guidance from Apple"\.

![0261_64-bit_Errors_Are_Here_ru/image1.png](https://import.viva64.com/docx/blog/0261_64-bit_Errors_Are_Here_ru/image1.png)

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

Мне на глаза попалась интересная статья "[Buggy Security Guidance from Apple](https://randomascii.wordpress.com/2014/04/17/buggy-security-guidance-from-apple/)"\.

Прежде чем продолжить читать мой комментарий, прошу познакомиться с ней\. Интересным мне показалось следующее\. Проделав большую работу, реализовав правильные проверки на переполнение, очень легко ошибиться в простом\. А именно \- перемножить две переменные типа 'int' и поместить в результат в переменную типа 'size\_t'\.

Я имею в виду вот эту строчку:

```cpp
size_t bytes = n * m;
```

Которую рекомендуют заменить на:

```cpp
size_t bytes = (size_t)n * (size_t)m;
```

Это очень распространенный вид 64\-битной ошибки\. Его крайне трудно заметить и выявить\.

Кажется, люди наконец начали сталкиваться с тем, что я описывал ещё несколько лет назад в своих статьях или руководстве по разработке 64\-битных приложений\. Рекомендую для ознакомления:

* [Коллекция примеров 64\-битных ошибок в реальных программах](https://pvs-studio.ru/ru/blog/posts/cpp/a0065/)
* [64\-битный конь, который умеет считать](https://pvs-studio.ru/ru/blog/posts/cpp/a0043/)
* [Руководство по созданию 64\-битных приложений](https://pvs-studio.ru/ru/blog/lessons/)

Но самое главное \- недостаточно просто знать о таких ошибках\. Да, вы напишите новый код правильно\. Но что делать со старым? Сколько там таких дефектов и как их найти?

Подсказываю ответ\. Нужно воспользоваться анализатором PVS\-Studio\. А вернее [набором 64\-битных диагностик](https://pvs-studio.ru/ru/pvs-studio/)\.

То, что ошибка с переполнением является распространенной, станет ясно из предупреждения, которое он выдаст на строку "size\_t bytes \= n \* m;"\.

Предупреждение: V101 Implicit assignment type conversion to memsize type\. 

Обратите внимание, что номер у диагностики V101\. Это самое первое 64\-битное диагностическое правило, которые было нами реализовано\. Опасности, о которых сейчас говорят, были очевидны нам давно\. Так что не сомневайтесь \- PVS\-Studio отличный инструмент для поиска 64\-битных ошибок\.

Примечание\. Будьте готовы, что 64\-битные диагностики дают много ложных срабатываний\. Но это неизбежно\. Анализатор не знает, считает ли программа количество дней в месяце или подсчитывает размер огромного файла\. PVS\-Studio часто не может понять, какие значения хранят переменные и будет ли переполнение\. Но, к сожалению, ничего лучше всё равно нет\. PVS\-Studio лидер в выявлении 64\-битных ошибок\. А для подавления ложных срабатываний существует множество [механизмов](https://pvs-studio.ru/ru/docs/manual/0017/)\.