Hi all,
I have question about the code written in the 'mc_Permissions::SetPermissionInternal' function of 'src/permissions/permission.cpp' file.
The following snippet code shows the Undefined behavior case which I would like to understand.
With such UB case the code seems to work somehow on 64 bit machine.
...
uint32_t types[9];
uint32_t pr_entity,pr_address,pr_admin;
num_types=0; // num_types is 0
types[num_types]=MC_PTP_CONNECT;num_types++; // num_types is 1
types[num_types]=MC_PTP_SEND;num_types++;// num_types is 2
types[num_types]=MC_PTP_RECEIVE;num_types++;// num_types is 3
if(mc_gState->m_Features->Streams())
{
types[num_types]=MC_PTP_WRITE;num_types++; // num_types is 4
types[num_types]=MC_PTP_CREATE;num_types++; // num_types is 5
}
types[num_types]=MC_PTP_ISSUE;num_types++;// num_types is 6
types[num_types]=MC_PTP_MINE;num_types++;// num_types is 7
types[num_types]=MC_PTP_ACTIVATE;num_types++; // num_types is 8
types[num_types]=MC_PTP_ADMIN;num_types++; // num_types is 9
if(mc_gState->m_Features->Upgrades())
{
types[num_types]=MC_PTP_UPGRADE;num_types++; // num_types is 10
}
err=MC_ERR_NOERROR;
for(i=0;i<num_types;i++) // As num_types is equal to 10 the last value of the variable 'i' is 9.
{
if(types[i] & type) // at this point when 'i' has value 9 the code tries to get types[9] which is Undefined Behavior.
...
I would really appreciate detailed explanation of this piece if my understanding is wrong and the code above is not just a bug.
Thanks,
Arsen