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

Переполнение буфера - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 00:46     Переполнение буфера #1
Подскажите, пожалуйста кто-нибудь, в чем беда... Во время выполения программы пишет, что буфер переполнен, что точка останова смещена и "Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера"". Как справиться с сией проблемой? Что нужно изменять в коде программы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 00:46     Переполнение буфера
Посмотрите здесь:

C++ переполнение буфера
C++ Переполнение буфера
C++ Переполнение буфера! (наверное)
Переполнение буфера . Что делать ? C++
C++ Переполнение буфера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.05.2013, 00:49     Переполнение буфера #2
без кода ничего никто не скажет. какой буфер, где и при каких условиях.
в таких случаях кэп советует
см. в разделе "Инструкции по отладке в случае переполнения буфера""
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 01:09  [ТС]     Переполнение буфера #3
Вот код программы:
Заголовочный файл класса
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
#pragma once
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include "bmp_structs.h"
using namespace std;
 
class BMP
{
public:
    BitMapHeader bh;
    BitMapInfoHeader bih;
    RGBQUAD RGBQuad[256];
    BMP();
    void ReadQuad(RGBQUAD* RGB, int biSize, char* filename);
    void France_flag(char* filename);
 
    BMP read_BMP_info(char* filename);
    
    
    friend struct BitMapHeader;
    friend struct BitMapInfoHeader;
    friend struct RGBQUAD;
    ~BMP();
    
    
};
Файл описания методов

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
#include "StdAfx.h"
#include "BMP.h"
 
 
BMP::BMP()
{
}
 
 
void BMP::ReadQuad(tagRGBQUAD* RGB, int biSize, char* filename)
{
    fstream f(filename, ios::binary | ios::out | ios::in | ios::ate);
    f.seekg(biSize, SEEK_SET);
    f.read((char*)& RGB, 1024);
    f.close();
}
BMP BMP::read_BMP_info(char* filename)
{
    BMP h;
    fstream f(filename,ios::binary | ios::out | ios::in | ios::ate);
    f.seekg(0, ios::beg);
    f.read((char*)& h.bh,sizeof(bh));
    f.read((char*)& h.bih,sizeof(bih));
    h.ReadQuad(RGBQuad, h.bih.biSize + 14, filename);
    f.close();
    return h;
}
void BMP::France_flag(char* filename)
{
    BMP h;
    fstream f(filename, ios::binary | ios::out | ios::in | ios::ate);
    h.read_BMP_info(filename);
    f.seekg(h.bh.bfOffbits + 14, ios::beg);
    int n = h.bih.biHeight / 3;
    int m = h.bih.biWidth;
    tagRGBQUAD* part1 = new tagRGBQUAD [n * m] ;
    tagRGBQUAD* part2 = new tagRGBQUAD [n * m];
    tagRGBQUAD* part3 = new tagRGBQUAD [n * m];
    for(int i = 0; i < n * m; i ++)
    {
        part1[i].rgbBlue = 255;
        part2[i].rgbBlue = 255;
        part3[i].rgbBlue = 0;
        part1[i].rgbGreen = 255;
        part2[i].rgbGreen = 0;
        part3[i].rgbGreen = 0;
        part1[i].rgbRed = 255;
        part2[i].rgbRed = 0;
        part1[i].rgbRed = 255;
    }
    f.seekg(h.bh.bfOffbits + 14, ios::beg);
    f.write((char*)& part1, sizeof(part1));
    f.write((char*)& part2, sizeof(part2));
    f.write((char*)& part3, sizeof(part3));
    f.close();
    
    
}
BMP::~BMP()
{
}
И файл описания структур для BMP файлов:
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
typedef unsigned short int word; 
typedef unsigned int dword;
#pragma pack(push)
#pragma pack(1)
 
struct BitMapHeader
{
word bfType; 
dword bfSize; 
word bfReserved1;  
word bfReserved2;  
dword bfOffbits; 
};
 
struct BitMapInfoHeader
{
dword biSize ; 
dword biWidth;
dword biHeight; 
word biPlanes;
word biBitCount;  
dword biCompression; 
dword biSizeImage; 
dword biXPelPerMeter; 
dword biYPelPerMeter;  
dword biClrUsed;  
dword biClrImportant;
};
typedef unsigned char BYTE;
 
#pragma pack(pop)
 
struct RGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
};
Это класс для работы с BMP файлами и методом для рисования французского флага

Добавлено через 2 минуты
И выделенный момент с ошибкой:

"8-bit_BMP.exe": Загружено: "D:\Vs\8-bit_BMP\Debug\8-bit_BMP.exe", Символы загружены.
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\ntdll.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Program Files\AVAST Software\Avast\snxhk.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\kernel32.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\KernelBase.dll", Невозможно найти или открыть файл PDB
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\msvcp100d.dll", Символы загружены.
"8-bit_BMP.exe": Загружено: "C:\Windows\System32\msvcr100d.dll", Символы загружены.
Первый этап обработки исключения в "0x00af5286" в "8-bit_BMP.exe": 0xC0000005: Нарушение прав доступа при чтении "0x999999a5".
В 8-bit_BMP.exe возникло переполнение буфера, что привело к повреждению внутреннего состояния программы. Нажмите кнопку "Прервать", чтобы отладить программу, или кнопку "Продолжить", чтобы завершить программу.

Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера".
В 8-bit_BMP.exe возникло переполнение буфера, что привело к повреждению внутреннего состояния программы. Нажмите кнопку "Прервать", чтобы отладить программу, или кнопку "Продолжить", чтобы завершить программу.

Дополнительные сведения см. в разделе "Инструкции по отладке в случае переполнения буфера".

STATUS_STACK_BUFFER_OVERRUN encountered
8-bit_BMP.exe привело в действие точку остановка
Программа "[7212] 8-bit_BMP.exe: Машинный код" завершилась с кодом -1073740791 (0xc0000409).
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.05.2013, 01:22     Переполнение буфера #4
осваивайте отладку программ.
в студии с этим все просто.
беглый взгляд падает на строку 14:
f.read((char*)& RGB, 1024);

возможно хотелось так:
f.read((char*)RGB, 1024);
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 01:29  [ТС]     Переполнение буфера #5
Исправление этого момента помогло..Немного. Теперь буфер не переполняется, но все равно программа падает
Миниатюры
Переполнение буфера  
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 01:30  [ТС]     Переполнение буфера #6
Как я понимаю, ему не нравится размер, вот только размер чего? И почему не нравится?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.05.2013, 08:19     Переполнение буфера #7
Цитата Сообщение от Eagle123 Посмотреть сообщение
Как я понимаю, ему не нравится размер, вот только размер чего? И почему не нравится?
Судя по ошибке на картинке имеется попытка выделения памяти, задав отрицательное число, которое в итоге интерпретируется как слишком большое положительное.
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 08:24  [ТС]     Переполнение буфера #8
C++
1
2
3
4
5
 int n = h.bih.biHeight / 3;
    int m = h.bih.biWidth;
    tagRGBQUAD* part1 = new tagRGBQUAD [n * m] ;
    tagRGBQUAD* part2 = new tagRGBQUAD [n * m];
    tagRGBQUAD* part3 = new tagRGBQUAD [n * m];
НАверное это в этом моменте?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
13.05.2013, 08:36     Переполнение буфера #9
Eagle123,
вот на этой картинке что ты привел
нажми продолжить
программа упадет еще раз
тогда нажми прервать
и попадешь в отладчик на точку что вызвала исключение
скорее всего попадешь в какую нибудь системную функцию
тогда идешь в отладчике в окошка стека
там будет список функций которые вызваны до аварии
просмотри их сверху вниз и тогда дойдешь до строки с неправильными параметрами
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 14:40  [ТС]     Переполнение буфера #10
Цитата Сообщение от Eagle123 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
BMP BMP::read_BMP_info(char* filename)
{
* * BMP h;
* * fstream f(filename,ios::binary | ios::out | ios::in | ios::ate);
* * f.seekg(0, ios::beg);
* * f.read((char*)& h.bh,sizeof(bh));
* * f.read((char*)& h.bih,sizeof(bih));
* * h.ReadQuad(RGBQuad, h.bih.biSize + 14, filename);
* * f.close();
* * return h;
}
Разобрался. Надо было переделать немного эту функцию
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.05.2013, 14:46     Переполнение буфера #11
Цитата Сообщение от Eagle123 Посмотреть сообщение
Надо было переделать немного эту функцию
Что в итоге?
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 18:46  [ТС]     Переполнение буфера #12
В итоге считывается информация из файла правильно, и массив создается тоже верно.
И все бы хорошо, только рисует не флаг, а вот это.
Миниатюры
Переполнение буфера  
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 18:47  [ТС]     Переполнение буфера #13
Вот функция, которая это рисует. Что-то тут не так
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
void BMP::France_flag(char* filename)
{
    BMP h;
    fstream f(filename, ios::binary | ios::out | ios::in);
    h.read_BMP_info(filename);
    
    
    unsigned int n = h.bih.biHeight;
    unsigned int m = h.bih.biWidth;
    
    BYTE* Str = new BYTE [m];
    for(int i = 0; i < m / 3; i ++)
        Str[i] = 0xCC;
    for(int i = m / 3; i < 2 * (m / 3); i ++)
        Str[i] = 0xFF;
    for(int i = 2 * (m / 3); i < m; i ++)
        Str[i] = 0x99;
 
    f.seekg(h.bh.bfOffbits, ios::beg);
    int counter = 0;
    while(counter != h.bih.biHeight)
    {
        f.write((char*)Str, h.bih.biWidth);
        counter ++;
    }
    
    f.close();
    
    
}
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
13.05.2013, 19:12     Переполнение буфера #14
Eagle123,
А ты откуда берешь размеры
Из заголовка файла?
а ты учел что там два размера размер картинки и размер буфера выравненный то ли на 2 то ли на 4 (нет сейчас спецификации под рукой) и они могут различаться
и учти что в BMP шке картинка размещена вверх ногами
т.е самая нижняя строчка в буфере самая первая

Добавлено через 1 минуту
Да и с палирой разберись ты видать её не загружаешь
у французского флага никак не такие цвета
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 19:22  [ТС]     Переполнение буфера #15
С цветами все нормально. Там если увеличить, то видны нужные полосы (синего, белого и красного цветов). Только на картинке они накладываются друг на друга... Получается, если запись идет с конца, то надо делать не сине-бело-красный, а красно-бело-синий флаг?? А вот с размерами теперь не ясно, там же в структуре заголовка только одна длина и ширина?

Еще нашел, что надо учитывать кол-во байтов на пиксель..Это так?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
13.05.2013, 19:36     Переполнение буфера #16
http://www.firststeps.ru/mfc/msdn/r.php?114
Вот это
22h 4 biSizeIm Размер изображения в байтах
и это
12h 4 biWidth Ширина Bitmap-а в пикселях
16h 4 biHeight Высота Bitmap-а в пикселях

Добавлено через 3 минуты
Цитата Сообщение от Eagle123 Посмотреть сообщение
Еще нашел, что надо учитывать кол-во байтов на пиксель..Это так?
ну очень просто если у тебя 24 битное изображение
то считываешь
1 байт красный
2 байт зеленый
3 байт синий
4 зарезервирован
т.е на одну точку считывать нужно 4 байта
если 256 цветов то на одну точку 1 байт
а если двухцветное изображение то один байт на 8 точек

Добавлено через 44 секунды
вот еще http://c-site.h1.ru/infa/bmp_struct.htm
сноску почитай
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 19:40  [ТС]     Переполнение буфера #17
Размер изображения в байтах = 226000, размер в пикселях т.е. h.bih.biHeight * h.bih.biWidth = 900 * 500 = 450000. И по каким размерами тогда составлять массив для цветов и записывать его, по байтам??

Добавлено через 2 минуты
Изображение 16-ти цветное
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 19:47  [ТС]     Переполнение буфера #18
Изменил началиный размер изображения ( сделал размеры сторон кратные 4), получилось вот так
Миниатюры
Переполнение буфера  
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
13.05.2013, 19:51  [ТС]     Переполнение буфера #19
Но сразу заметно, что изображение закрашено не полностью, видны какие-то полосы. Поэтому цвета так смешиваются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 20:49     Переполнение буфера
Еще ссылки по теме:

C++ Не получается сделать переполнение буфера
Переполнение буфера C++
Переполнение буфера, адрес возврата C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
13.05.2013, 20:49     Переполнение буфера #20
Цитата Сообщение от Eagle123 Посмотреть сообщение
Изображение 16-ти цветное
сделай сначала полноцветное изображение (32 бита на пиксел) разберись с ним
или поройся в сети найди готовые библиотеки
Yandex
Объявления
13.05.2013, 20:49     Переполнение буфера
Ответ Создать тему
Опции темы

Текущее время: 10:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru