user2793162
user2793162

Reputation:

encountered strange situation-variable value

I am programming on some device and I encountered rather strange situation. The same variable - for the first time has correct value, but the SAME variable on a different place in code, has a DIFFERENT value. What can be causing this? I am pretty sure I didn't modify the variable in between, I am also pretty sure I didn't modify the variable using some pointers accidentally.

What can be causing this? I am really confused? Can it be related that I for example used whole available stack space of some function - and because of this compiler automatically 0-ifies my variable(or something similar)? I have some long code inside a single function f.

Here's whole details on usage of pointsEntered variable in my code (how it is used).

  /* Let the user input points */

  s32 pointsEntered = 0;
  int pointsCounter = 0;
  while(1)
  {

     if(pointsCounter == 3)
       return; // User entered wrong points 3 times, exit function

     bool retStatus = false;
     retStatus = inputPoints(&pointsEntered);

     if(false == retStatus) // If user didn't enter amount, exit this function
       return;

     if(pointsEntered>atoi(userAmount)){
          PromptBox(false, 0, "Points should not be more\n than current points");
       pointsCounter++;  
       continue;
     }
     break;

 }

// PROBLEM: pointsEntered  - is OK here but as it will be shown below, it gets modified down the way
// even though I don't change it directly

  char intTest1[50];
  sprintf(intTest1, "1pentered %d", pointsEntered); // Here the value is OK! It shows value that I entered, e.g., 220
  PromptBox(false, 0, intTest1);  



  /* Let the user enter 4 digit pin code */
  u8 pinEntered[5] = {0};
  bool retStatus1 = false;
  retStatus1 = inputPin(pinEntered);
  pinEntered[5]='\0';
  if(false == retStatus1) // If user didn't enter amount, exit this function
     return;

  char intTest2[50];
  sprintf(intTest2, "2pentered %d", pointsEntered); // Here pointsEnetered is OK
  PromptBox(false, 0, intTest2); 


  /* Compute hash of pin code*/
  s32 siRet1 = 0;
  u8 pinVerify[25]={0};
  u8 hashResult[16] = {0};
  memcpy(pinVerify,pinEntered,4);
  memcpy(&pinVerify[4],"XXXX",21);
  siRet1 = sdkMD5(hashResult,pinVerify,25);

  char intTest3[50];
  sprintf(intTest3, "3pentered %d", pointsEntered); // Here pointsEntered has changed!!!
   PromptBox(false, 0, intTest3); 

  /* convert string hash code to byte array */
  unsigned char val[16] = {0};
  unsigned char * pos = pinHash;
  size_t count = 0;
  // WARNING: no sanitization or error-checking whatsoever 
  for(count = 0; count < sizeof(val)/sizeof(val[0]); count++) 
  {
     sscanf(pos, "%2hhx", &val[count]);
     pos += 2 * sizeof(char);
  }

  char intTest4[50];
  sprintf(intTest4, "4pentered %d", pointsEntered);
  PromptBox(false, 0, intTest4); 

  /* Does the pin hash match ? */
  if (siRet == SDK_OK && (!memcmp(hashResult,val,16)))
  {
    MsgBox("PIN OK","",0,SDK_KEY_MASK_ESC | SDK_KEY_MASK_ENTER);
  }
  else
  {
    MsgBox("PIN doesn't match-exiting","",0,SDK_KEY_MASK_ESC | SDK_KEY_MASK_ENTER);
    return;

  }

  char intTest[50];
  sprintf(intTest, "pentered %d", pointsEntered);
  PromptBox(false, 0, intTest);  

Upvotes: 0

Views: 79

Answers (1)

Some programmer dude
Some programmer dude

Reputation: 409166

These two lines may cause it (as it's undefined behavior):

u8 pinEntered[5] = {0};
...
pinEntered[5]='\0';

Here you declare an array of five entries, but then you assign to a sixth item. This will most likely overwrite any previous variable on the stack.

Upvotes: 4

Related Questions