Яндекс.Метрика

cpp

Найди ошибки. Пример 1

Как я понял моя идея с игрой «найди ошибки в коде» получила поддержку. Давайте попробуем. Вот первый пример кода, содержащий некоторое количество 64-битных ошибок. Если понравится этот пост, следующие примеры будут для разнообразия еще содержать параллельные ошибки и ошибки на внимательность.


Итак, рассмотрим программы, содержащие ошибки. Этот код компилируется в 32-битном и 64-битном режиме. В 32-битном он работоспособен, в 64-битном — нет. Вы также можете скачать здесь проект с этим кодом для Visual Studio 2005.

Программа просит пользователя ввести пять чисел в диапазоне от 0 до 100. Если пользователь введет число вне этого диапазона, то программа сообщит об этом: «Некорректное число в позиции N». Затем программа проверяет, вводил ли пользователь цифру '5' при вводе данных. Если это так, то программа выдает соответствующее сообщение:«Был использован символ '5'.».

Текст программы:
#include <tchar.h>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct MyStruct
{
  int m_v;
  void *m_p;
};

int _tmain(int, _TCHAR*)
{
  locale::global(locale("Russian_Russia.1251"));
  MyStruct *A = NULL;

  try {
    cout << "Введите 5 чисел (диапазон 0..100) : ";

    size_t structSize = sizeof(int) + sizeof(void *);
    A = (MyStruct *)malloc(structSize * 5);
    if (A == NULL)
      return 1;

    for (size_t i = 0; i != 5; i++)
      cin >> A[i].m_v;

    stringstream buf;
    for (MyStruct *p = A; p <= &A[4]; p++)
    {
      if (p->m_v < 0 || p->m_v > 100)
        throw p - A;
      buf << p->m_v;
    }

    string str = buf.str();
    size_t result = str.find("5");
    if (result != unsigned(-1))
      cout << "Был использован символ '5'." << endl;

    free(A);
  }
  catch (int position)
  {
    free(A);
    cout << "Некорректное число в позиции "
         << position + 1 << "." << endl;
  }
  return 0;
} 


Предлагаю силой мысли найти имеющиеся в коде ошибки и описать их. После обсуждения я выложу корректный вариант программы и кратко поясню ошибки, если что-то останется неясным.

P.S.
Хочу попросить обсуждать именно ошибки, а не недостатки программы. Например, понятно, что использовать магическую константу 5 (количество элементов) это не хорошо. Но к ошибкам это не имеет отношения. Также прошу не обсуждать, что программа не имеет смысла, что она неэффективна, что ее можно оптимизировать и сократить. :)