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

    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 (количество элементов) это не хорошо. Но к ошибкам это не имеет отношения. Также прошу не обсуждать, что программа не имеет смысла, что она неэффективна, что ее можно оптимизировать и сократить. :)