Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
George Sirin
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 46
#1

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

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

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

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

Заранее спасибо!
0
Вложения
Тип файла: rar PidGenX_src.rar (18.5 Кб, 9 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2015, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "Ляпы" в программе. Хороший стиль программирования (C++):

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

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

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

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

Хороший или плохой тон программирования - C++
вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а почему?очень нужная вещь,иногда лучше использовать это чем циклы

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Почтальон
Модератор
373 / 296 / 56
Регистрация: 22.03.2015
Сообщений: 2,319
Завершенные тесты: 1
05.10.2015, 11:55 #2
Что мешает листинг под спойлер загнать ?
1
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 1
05.10.2015, 13:32 #3
Например,
C++
1
2
3
    strTo = new WCHAR[len + 1];
    if(!strTo)
        return false;
В случае неудачи, new кинет исключение, так что до условия выполнение не дойдет.
1
DrOffset
7134 / 4275 / 963
Регистрация: 30.01.2014
Сообщений: 7,064
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
Сообщений: 46
08.10.2015, 21:13  [ТС] #5
Спасибо большое за помощь!
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
09.10.2015, 09:11 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
до условия выполнение не дойдет
Можно обойти: new(nothrow)
0
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 1
09.10.2015, 10:57 #7
Izual, и нахрен оно нужно?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
09.10.2015, 11:07 #8
Цитата Сообщение от Croessmah Посмотреть сообщение
В случае неудачи, new кинет исключение, так что до условия выполнение не дойдет.
На 64 битных машинах может и не кинуть и до условия дело дойтет и указатель будет не 0, только писать в память будет нельзя. Исключение будет в момент записи. Незнаю как в винде, но в линуксе mmap будет возвращать указатели, пока виртуальная память не кончится.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
09.10.2015, 18:23 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
и нахрен оно нужно?
Ну не описывать же все exceptions.. Nothrow и по NULL уже определять, выделилось или нет.. Или не так?
0
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 1
09.10.2015, 20:13 #10
Kastaneda, ну так, например, Саттер об этом тоже писал. nothrow не делает код безопаснее.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2015, 20:13
Привет! Вот еще темы с ответами:

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

CString buff = "aaa" + "bbb" - C++
Хочется одним оператором конкатенировать несколько подстрок CString buff = "aaa" + "bbb" компилятор выдает error C2110: cannot add two...

Qt Creator. Все "за" и "против" - C++
Доброго времени суток, форумчане! Сегодня задался вопросом использования такой IDE, как Qt Creator. Суть темы заключается в том, что я...

Ординарная Сеть Петри для задачи об "обедающих философах" - C++
Помогите с сетью Петри. дуб в этом Задача об обедающих философах. Пять философов отдыхают в пансионате. Каждый из философов может...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.10.2015, 20:13
Ответ Создать тему
Опции темы

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