Taille max d'un buffer

Fermé
darckangel7 Messages postés 2 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 19 novembre 2008 - 18 nov. 2008 à 17:34
darckangel7 Messages postés 2 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 19 novembre 2008 - 19 nov. 2008 à 09:52
Bonjour,

je suis débutant on c++ et dans le cadre de mon travail je doit résoudre un problème au niveau d'une application.
le problème est cette application doit fonctionné sur les plate-forme divers ( LINUX, SUN et HP). elle tourne a merveille sur le différente plate-forme sauf que dernièrement un de nos client l'a installe sur une machine HP Itanuim. et depuis le programme crash et me retourne un signal 6.
après une première analyse je pense que le problème se produit au niveau de :
char* buf = new char[pduLen + 1l]; lorsque la pdu est corrompit ou de très grande taille. puisque les trace s'arrête a ce niveau du code avec une taille de "1195986768".
j'aimerai savoir si mon analyse est correcte ou pas?
est ce que quelqu'un connais une façon de savoir la taille max du buffer sur machine bien détermine (surtout les machine HP)?
est ce qu'il y'a une façon de la changé sans risque de crash sur cette machien (pour mon programme ou bien les autres programmes)?
voici le bou de code qui est responsable du crash:

SLAC_Sock::E_SockError
SLAC_Sock::readPDU(SLAC_Pdu*& pdu)
{
SSC_DoTraceMethod("SLAC_Sock::readPDU");
E_SockError result = ok;

long pduLen;

// ADMax86631
result = receiveSocketData((char*) &pduLen, sizeof(long));


if (result == ok)
{
// ADMax86631
if (pduLen == 0l)
{
// This most probably is a [re]connect request PDU from version 510 or
// higher. This 0l is followed by the exact version, and then by the
// "classical" PDU length then PDU encoded image.
// ADMax86631 {
result = receiveSocketData((char*) &version_, sizeof(long));
if (result == ok)
{
if ((int)version_ > 5)
{
invertData ((char*)&version_);
}
result = receiveSocketData((char*) &pduLen, sizeof(long));
// ADMax86631 }
SSC_DebugTrace << pduLen << endl;
} // end if
} // end if
else
{
if (pduLen < 0l)
return failure;
}

if (result == ok)
{
#if defined (_WIN32) || defined (LINUXREFPLAT)
if ((*((char*)&pduLen) == 0))
#else
if ((*((char*)&pduLen + sizeof(long)-1) == 0))
#endif
{
invertData ((char*) &pduLen);
}

// socket port
//if (pduLen > 8192)
// pduLen = 8192;
//if the value is 0 , the maxPduLength will not be taken into account
SSC_DebugTrace <<"maxPduLength_ is set to "<< maxPduLength_ << endl;
if(maxPduLength_ != 0)
{
if (pduLen > maxPduLength_)
pduLen = maxPduLength_;
}
SSC_DebugTrace <<"PduLen is set to "<< pduLen << endl;

char* buf = new char[pduLen + 1l];
// ADMax86631
result = receiveSocketData(buf, (int) pduLen);

if (result == ok)
{
// ADMax86631
String dump("<");
for (int i = 0; i < pduLen; i++)
{
dump += int_to_str(*(buf + i));
dump += ".";
if ((i % 50) == 0)
dump += "\n";
} // end if
dump += ">";

SSC_DebugTrace << dump << endl;

buf[pduLen] = '\0';
pdu = SLAC_Pdu::decodePdu(version_, buf, pduLen);

//SSC_DebugTrace << *pdu << endl;

if (!pdu)
{
return readError;
}
else
SSC_DebugTrace << *pdu << endl;

//SSC_DebugTrace << "Id: " << ENUM_CAST pdu->getId_() << "." << endl;
} // end if
delete [] buf;

} // end if
}//end if
return result;
} // SLAC_Sock::readPDU

Merci beaucoup de m'aide

2 réponses

kill4m Messages postés 224 Date d'inscription jeudi 12 juin 2008 Statut Membre Dernière intervention 28 janvier 2012 26
18 nov. 2008 à 17:47
char* buf = new char[pduLen + 1l];

"1195986768" c'est pduLen qui fais cette taille la ??

dans ce cas la fonction alloue un tableau de char (caractère) de taille 1195986768.
c'est à dire 1195986768 de case dans ton tableau.

char = 8bits
1195986768*8= 9567894144 bits de stocké soit 1195986768 octet soit environ heu.... sa me semble beaucoup la quad même ....

soit mais calcul sont faux soit effectivement sa dépasse :)
0
darckangel7 Messages postés 2 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 19 novembre 2008
19 nov. 2008 à 09:52
oui je sait que c'est beaucoup. je croi même que le la pdu est corrompu et c'est pour ce la que je veux savoir la taille max que je peut alloue pour évité le cas des pdu corrompu ou qui dépasse la taille max.
0