Официальный сайт студ.городка НГТУ
Программирование и БД » [С++]исключение при компилинге... 

#1  08.05.09 04:46

[С++]исключение при компилинге...

есть кусок кода:

Код::

//lpDevParms - указатель на структуру с данными (сама структура объявлена статически)
//char *sParam - строка-константа вида "SEAT", "BILL", "USSD" и так далее
//char sRecvData[2048] - массив символов
//формат sRecvData строки типа такого: SEAT: 2\r\nBILL: 3\r\nUSSD: *101#\r\n ....

void GetCommaParam(char *sParam, LPDEVICE_PARAMS lpDevParms)
{
    char *sVal = new char[32];
    int iParamLen = 0;
    int iSearchStart = strlen(sParam)+2; //пропускаю ': '

    char *p = strstr(sRecvData, sParam);
    while (p[iSearchStart+iParamLen] != 0x0D) iParamLen++;
    memset(sVal,0,strlen(sVal));
    strncpy(sVal, &p[iSearchStart], iParamLen);
    
    if(strstr(sParam, "SEAT"))
        lpDevParms->nk = atoi(sVal);
    ...
    тут еще куча сравнений, но срабатывает пока только верхняя ветка
    
    delete sVal;
}

когда выходит из процедуры то вылезает такое исключени:
Windows has triggered a breakpoint in ComTest.exe.
This may be due to a corruption of the heap, which indicates a bug in ComTest.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while ComTest.exe has focus.
The output window may have more diagnostic information.

под p- указатель память не выделяется => что это просто переменная в стеке, освобождать не надо. 
Где Беда? Хелп!

Исправлено Filin (09.05.09 03:08)

Offline

#2  11.05.09 10:38

Я
Профиль

Re: [С++]исключение при компилинге...

1. strstr. sRecvData точно null terminated?
2. while... за границы sRecvData точно не вылезет? И где проверка p на null перед циклом?
Но это все так, мелочи по сравнению с:
memset(sVal,0,strlen(sVal))
Она то тебе стек и херачит. Откуда ей знать, что размер sVal 32 символа?

P.S. Из-за такие как ты у хакеров всегда есть возможность находить все новые и новые дыры. :)

Offline

#3  11.05.09 19:06

Re: [С++]исключение при компилинге...

Точно точно
вмсето  memset(sVal,0,strlen(sVal));
надо вот так:
            memset(sVal,0,sizeof(sVal));
спс большое!

Offline

#4  11.05.09 20:08

Re: [С++]исключение при компилинге...

Filin написал(а):

Точно точно
вмсето  memset(sVal,0,strlen(sVal));
надо вот так:
            memset(sVal,0,sizeof(sVal));
спс большое!

на лабы надо было ходить, а не в игрушки играть! :)
sizeof(sVal)=4, это же указатель

Offline

#5  11.05.09 20:24

Re: [С++]исключение при компилинге...

Matrim,
ну что поделаешь) бездельник я ) Прости мну Серега)

Offline

#6  16.05.09 23:37

Re: [С++]исключение при компилинге...

Matrim, тому, что sizeof(someFuckingPoinerInCpp)==4 ты в универе проинкся !?:)

Offline

#7  17.05.09 12:17

Re: [С++]исключение при компилинге...

efferson написал(а):

тому, что sizeof(someFuckingPoinerInCpp)==4 ты в универе проинкся !?:)

ну да, в этом есть что-то плохое?

Код: cpp:

#include <iostream>
using std::cout;
using std::endl;
 
int main()
{
	char a[32];
 
	if (a == &a[0]) {
		cout<<sizeof(a)<<endl;
		cout<<sizeof(&a[0])<<endl;
	}
 
	return 0;
}

Offline

#8  17.05.09 13:04

Re: [С++]исключение при компилинге...

Filin написал(а):

есть кусок кода:

Код::

//lpDevParms - указатель на структуру с данными (сама структура объявлена статически)
//char *sParam - строка-константа вида "SEAT", "BILL", "USSD" и так далее
//char sRecvData[2048] - массив символов
//формат sRecvData строки типа такого: SEAT: 2\r\nBILL: 3\r\nUSSD: *101#\r\n ....

void GetCommaParam(char *sParam, LPDEVICE_PARAMS lpDevParms)
{
    char *sVal = new char[32];
    int iParamLen = 0;
    int iSearchStart = strlen(sParam)+2; //пропускаю ': '

    char *p = strstr(sRecvData, sParam);
    while (p[iSearchStart+iParamLen] != 0x0D) iParamLen++;
    memset(sVal,0,strlen(sVal));
    strncpy(sVal, &p[iSearchStart], iParamLen);
    
    if(strstr(sParam, "SEAT"))
        lpDevParms->nk = atoi(sVal);
    ...
    тут еще куча сравнений, но срабатывает пока только верхняя ветка
    
    delete sVal;
}

skipped

еще одна небольшая неточность: в конце надо вместо

Код::

delete sVal;

Код::

delete [] sVal;

простое правило: если new со скобками, то delete тоже со скобками

Offline

#9  17.05.09 13:06

Re: [С++]исключение при компилинге...

Sunrise,
да и так проканало

Offline

#10  17.05.09 15:02

Re: [С++]исключение при компилинге...

господи, спасибо, что ты дал людям управляемый код

Offline

#11  17.05.09 15:08

Re: [С++]исключение при компилинге...

Sunrise написал(а):

простое правило: если new со скобками, то delete тоже со скобками

честно говоря, для базовых типов можно использовать обычную форму оператора delete

Offline

#12  17.05.09 20:29

Я
Профиль

Re: [С++]исключение при компилинге...

XuMiX, Говнокода от этого меньше не стало. Правда теперь в segfault не падает. :)

Offline

#13  17.05.09 20:31

Re: [С++]исключение при компилинге...

Я, ага, теперь все больше OutOfMemoryException :)))

Offline

Программирование и БД » [С++]исключение при компилинге... 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.982 сек.
Выполнено 14 запросов.