Ah OK.
Version imprimable
Ah OK.
Le plantage a lieu avec pour case MODE_BANK_ARRAY. Le code exécuté dans ce cas est, en supposant qu'aucune des erreurs détectées par le code ne se produise, et en supprimant des cast abusifs et inutiles :
Je suis étonné du calcul de pBase + iOffset + sizeof(ST_SC_BankInfo) * iID avec un pbase de type void* : la taille de l'objet pointé est inconnue.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 int SC_ShmGetStru(int iShmID, int iMode, int iID, void **pAddr) //iMode ==MODE_BANK_ARRAY { int i, iOffset, iStruSize; ST_SC_BankInfo *pstBank = NULL; ST_SC_SvcInfo *pstSvc = NULL; void *pBase; pBase = shmat(iShmID, NULL, 0); iOffset = sizeof(ST_SC_Config); iStruSize = sizeof(ST_SC_BankInfo); *pAddr = pBase + iOffset + sizeof(ST_SC_BankInfo) * iID; return 0; }
Vu la présence d'un sizeof dans ce calcul, j'opterai pour :
Quand au if :Code:*pAddr = (char*)pBase + iOffset + sizeof(ST_SC_BankInfo) * iID;
me semble logiqueCode:if ( (pBase = shmat(iShmID, NULL, 0)) == (void*)-1) ...