﻿# Урок 22\. Паттерн 14\. Перегруженные функции

При переносе 32\-битных программ на 64\-битную платформу может наблюдаться изменение логики ее работы, связанное с использованием перегруженных функций\. Если функция перекрыта для 32\-битных и 64\-битных значений, то обращение к ней с аргументом типа [memsize](https://pvs-studio.ru/ru/blog/terms/0030/) будет транслироваться в различные вызовы на различных системах\. Этот прием может быть полезен, как, например, в приведенном коде:

```cpp
static size_t GetBitCount(const unsigned __int32 &) {
  return 32;
}
static size_t GetBitCount(const unsigned __int64 &) {
  return 64;
}
size_t a;
size_t bitCount = GetBitCount(a);
```

Но такое изменение логики хранит в себе опасность\. Представьте себе программу, где используется класс для организации стека\. Особенность этого класса в том, что он позволяет хранить значения различных типов:

```cpp
class MyStack {
...
public:
  void Push(__int32 &);
  void Push(__int64 &);
  void Pop(__int32 &);
  void Pop(__int64 &);
} stack;
ptrdiff_t value_1;
stack.Push(value_1);
...
int value_2;
stack.Pop(value_2);
```

Неаккуратный программист помещал и затем выбирал из стека значения различных типов \([ptrdiff\_t](https://pvs-studio.ru/ru/blog/terms/0041/) и int\)\. На 32\-битной системе их размеры совпадали, все замечательно работало\. Когда в 64\-битной программе изменился размер типа ptrdiff\_t, то в стек стало попадать больше байт, чем затем извлекаться\.

Думаем, что вам понятен данный класс ошибок, и как внимательно следует относиться к вызову перегруженных функций, передавая фактические аргументы типа memsize\.

## Диагностика

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

_Авторы курса: Андрей Карпов \([karpov@viva64\.com](mailto:karpov@viva64.com)\), Евгений Рыжков \([evg@viva64\.com](mailto:evg@viva64.com)\)\._

_Правообладателем курса "Уроки разработки 64\-битных приложений на языке Си/Си\+\+" является ООО "Системы программной верификации"\. Компания занимается разработкой программного обеспечения в области анализа исходного кода программ\. [Сайт компании](https://pvs-studio.ru/ru/pvs-studio/)\._