Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
George Sirin
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 58
1

"Ляпы" в программе. Хороший стиль программирования

04.10.2015, 20:51. Просмотров 472. Ответов 9
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане!

Я на счет хорошего стиля программирования. Сделал маленькую программу. Эксперты ее осмотрели и обнаружили "ляпы". То есть непростительные ошибки. То есть программа компилируется, но при выполнении подвергается опасностям. И, к сожалению, я так не узнал о них. Посмотрите, пожалуйста, если не сложно, может что то бросится в глаза Вам при просмотре кода. Программа маленькая. Не выкладываю листинги в эту тему, есть ограничения длинны сообщения. Прикрепляю ее архив.

Заранее спасибо!
0
Вложения
Тип файла: rar PidGenX_src.rar (18.5 Кб, 10 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2015, 20:51
Ответы с готовыми решениями:

"С" стиль именование статической функции
Реально ли создать dll c++ со статической функцией класса и именованием в стиле...

Что значит "средства комбинирования в языках программирования"?
Доброго времени суток. Как понять вопрос "средства комбинирования в языках...

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере...

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz")
Найти в строке последовательность символов ("abcd") и заменить ее другой...

Хороший или плохой тон программирования
вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а...

9
Почтальон
Модератор
698 / 575 / 119
Регистрация: 22.03.2015
Сообщений: 3,922
Завершенные тесты: 2
05.10.2015, 11:55 2
Что мешает листинг под спойлер загнать ?
1
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
05.10.2015, 13:32 3
Например,
C++
1
2
3
    strTo = new WCHAR[len + 1];
    if(!strTo)
        return false;
В случае неудачи, new кинет исключение, так что до условия выполнение не дойдет.
1
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
05.10.2015, 18:55 4
George Sirin,
Ну или вот тут:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Destructor.
// virtual.
KeyConfig::~KeyConfig()
{
    // Delete storages.
 
    // Bytes dyn buf.
    if(read_buffer)
        delete [] read_buffer;
 
    // String.
    strLastError.clear();
}
 
// Load config key data from file.
// Returns: true - success, false - error.
bool KeyConfig::loadConfigKeyData(wchar_t *strFilepath)
{
    // Open file.
    ifstream keyConfig(strFilepath, ios::in | ios::binary);
    if( ! keyConfig )
    {
        keyConfig.close();
        strLastError = wstring(L"Can't open file.") + strFilepath;
        return false; // Return error.
    }
 
    // Get whole bytes num in file.
    keyConfig.seekg(0, std::ios_base::end);
    const long int nFileLen = (const long int)(keyConfig.tellg());
    keyConfig.seekg(0, std::ios_base::beg); // Return to back.
 
    // Read whole data.
    read_buffer = new char [nFileLen+4]; // Reserve a piece of data in the end of buf - to put terminating character ('\0').
    keyConfig.read(read_buffer, nFileLen);
    if( ! keyConfig ) // Route read errors.
    {
//!!! Если попали сюда, то буфер освободился, но деструктор об этом не узнает и вызовет delete [] еще раз.
//!!! Ну и проверки на ноль конечно же не нужны. Но это уже безобидный "ляп"
        if(read_buffer) 
            delete [] read_buffer;
/*!! Нужно хотя бы так:
        if(read_buffer) {
            delete [] read_buffer;
            read_buffer = 0;
        }
*/
        keyConfig.close();
        strLastError = L"Can't read data from key config file.";
        return false; // Return error.
    }
 
    // Setup the terminating character ('\0') at and of buf.
    read_buffer[nFileLen+0] = 0x00;
    read_buffer[nFileLen+1] = 0x00;
    read_buffer[nFileLen+2] = 0x00;
    read_buffer[nFileLen+3] = 0x00;
 
    // Close file.
    keyConfig.close();
 
    // Return success.
    return true;
}
Ну и повсюду странное: бросаем строки в качестве исключений. Обработка ошибок неравномерная, то исключения, то last error.
Класс, который привел выше, кроме того, никак не запрещает копирование и присваивания своих объектов. А это, судя по семантике, предполагается.

Ну и всякое такое по мелочи, то конст забудем, то ссылку...
1
George Sirin
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 58
08.10.2015, 21:13  [ТС] 5
Спасибо большое за помощь!
0
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
09.10.2015, 09:11 6
Цитата Сообщение от Croessmah Посмотреть сообщение
до условия выполнение не дойдет
Можно обойти: new(nothrow)
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
09.10.2015, 10:57 7
Izual, и нахрен оно нужно?
0
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3017 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 1
09.10.2015, 11:07 8
Цитата Сообщение от Croessmah Посмотреть сообщение
В случае неудачи, new кинет исключение, так что до условия выполнение не дойдет.
На 64 битных машинах может и не кинуть и до условия дело дойтет и указатель будет не 0, только писать в память будет нельзя. Исключение будет в момент записи. Незнаю как в винде, но в линуксе mmap будет возвращать указатели, пока виртуальная память не кончится.
0
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
09.10.2015, 18:23 9
Цитата Сообщение от Croessmah Посмотреть сообщение
и нахрен оно нужно?
Ну не описывать же все exceptions.. Nothrow и по NULL уже определять, выделилось или нет.. Или не так?
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
09.10.2015, 20:13 10
Kastaneda, ну так, например, Саттер об этом тоже писал. nothrow не делает код безопаснее.
0
09.10.2015, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2015, 20:13

О "нестабильности" или "переполнении" цикла foreach
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь:...

Ошибка: invalid conversion from "int" to "SDL_RendererFlip"
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что...

CString buff = "aaa" + "bbb"
Хочется одним оператором конкатенировать несколько подстрок CString buff =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru