#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
#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

