unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Problem report #3
@ 2006-04-30 16:42 Dan Nicolaescu
  2006-05-01 20:27 ` Stuart D. Herring
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Nicolaescu @ 2006-04-30 16:42 UTC (permalink / raw)



CID: 3
Checker: DEADCODE (help)
File: emacs/lib-src/etags.c
Function: C_entries
Description: After this line, the value of "c" is equal to 47

3208 	static void
3209 	C_entries (c_ext, inf)
3210 	     int c_ext;			/* extension of C */
3211 	     FILE *inf;			/* input file */
3212 	{
3213 	  register char c;		/* latest char read; '\0' for end of line */
3214 	  register char *lp;		/* pointer one beyond the character `c' */
3215 	  int curndx, newndx;		/* indices for current and new lb */
3216 	  register int tokoff;		/* offset in line of start of current token */
3217 	  register int toklen;		/* length of current token */
3218 	  char *qualifier;		/* string used to qualify names */
3219 	  int qlen;			/* length of qualifier */
3220 	  int bracelev;			/* current brace level */
3221 	  int bracketlev;		/* current bracket level */
3222 	  int parlev;			/* current parenthesis level */
3223 	  int attrparlev;		/* __attribute__ parenthesis level */
3224 	  int templatelev;		/* current template level */
3225 	  int typdefbracelev;		/* bracelev where a typedef struct body begun */
3226 	  bool incomm, inquote, inchar, quotednl, midtoken;
3227 	  bool yacc_rules;		/* in the rules part of a yacc file */
3228 	  struct tok savetoken;	        /* token saved during preprocessor handling */
3229 	
3230 	
3231 	  linebuffer_init (&lbs[0].lb);
3232 	  linebuffer_init (&lbs[1].lb);
3233 	  if (cstack.size == 0)
3234 	    {
3235 	      cstack.size = (DEBUG) ? 1 : 4;
3236 	      cstack.nl = 0;
3237 	      cstack.cname = xnew (cstack.size, char *);
3238 	      cstack.bracelev = xnew (cstack.size, int);
3239 	    }
3240 	
3241 	  tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
3242 	  curndx = newndx = 0;
3243 	  lp = curlb.buffer;
3244 	  *lp = 0;
3245 	
3246 	  fvdef = fvnone; fvextern = FALSE; typdef = tnone;
3247 	  structdef = snone; definedef = dnone; objdef = onone;
3248 	  yacc_rules = FALSE;
3249 	  midtoken = inquote = inchar = incomm = quotednl = FALSE;
3250 	  token.valid = savetoken.valid = FALSE;
3251 	  bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
3252 	  if (cjava)
3253 	    { qualifier = "."; qlen = 1; }
3254 	  else
3255 	    { qualifier = "::"; qlen = 2; }
3256 	
3257 	
3258 	  while (!feof (inf))
3259 	    {
3260 	      c = *lp++;

Event equality_cond: Cond "c == 92" evaluated as false
Also see events: [dead_error_line][dead_error_condition][new_values][assignment][new_values][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3261 	      if (c == '\\')
3262 		{
3263 		  /* If we are at the end of the line, the next character is a
3264 		     '\0'; do not skip it, because it is what tells us
3265 		     to read the next line.  */
3266 		  if (*lp == '\0')
3267 		    {
3268 		      quotednl = TRUE;
3269 		      continue;
3270 		    }
3271 		  lp++;

Event assignment: Assigning "32" to "c"
Event const: After this line, the value of "c" is equal to 32
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][new_values][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3272 		  c = ' ';
3273 		}
3274 	      else if (incomm)
3275 		{
3276 		  switch (c)
3277 		    {
3278 		    case '*':
3279 		      if (*lp == '/')
3280 			{
3281 			  c = *lp++;
3282 			  incomm = FALSE;
3283 			}
3284 		      break;
3285 		    case '\0':
3286 		      /* Newlines inside comments do not end macro definitions in
3287 			 traditional cpp. */
3288 		      CNL_SAVE_DEFINEDEF ();
3289 		      break;
3290 		    }
3291 		  continue;
3292 		}
3293 	      else if (inquote)
3294 		{
3295 		  switch (c)
3296 		    {
3297 		    case '"':
3298 		      inquote = FALSE;
3299 		      break;
3300 		    case '\0':
3301 		      /* Newlines inside strings do not end macro definitions
3302 			 in traditional cpp, even though compilers don't
3303 			 usually accept them. */
3304 		      CNL_SAVE_DEFINEDEF ();
3305 		      break;
3306 		    }
3307 		  continue;
3308 		}
3309 	      else if (inchar)
3310 		{
3311 		  switch (c)
3312 		    {
3313 		    case '\0':
3314 		      /* Hmmm, something went wrong. */
3315 		      CNL ();
3316 		      /* FALLTHRU */
3317 		    case '\'':
3318 		      inchar = FALSE;
3319 		      break;
3320 		    }
3321 		  continue;
3322 		}
3323 	      else if (bracketlev > 0)
3324 		{
3325 		  switch (c)
3326 		    {
3327 		    case ']':
3328 		      if (--bracketlev > 0)
3329 			continue;
3330 		      break;
3331 		    case '\0':
3332 		      CNL_SAVE_DEFINEDEF ();
3333 		      break;
3334 		    }
3335 		  continue;
3336 		}

Event const: After this line, the value of "c" is equal to 34
Event const: After this line, the value of "c" is equal to 37
Event const: After this line, the value of "c" is equal to 39
Event const: After this line, the value of "c" is equal to 47
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][new_values][const][const][const][assignment][equality_cond][const][const][const]

3337 	      else switch (c)
3338 		{

Event new_values: Conditional "c == 34"
Also see events: [dead_error_line][dead_error_condition][equality_cond][assignment][new_values][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3339 		case '"':
3340 		  inquote = TRUE;
3341 		  if (inattribute)
3342 		    break;
3343 		  switch (fvdef)
3344 		    {
3345 		    case fdefunkey:
3346 		    case fstartlist:
3347 		    case finlist:
3348 		    case fignore:
3349 		    case vignore:
3350 		      break;
3351 		    default:
3352 		      fvextern = FALSE;
3353 		      fvdef = fvnone;
3354 		    }
3355 		  continue;

Event new_values: Conditional "c == 39"
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3356 		case '\'':
3357 		  inchar = TRUE;
3358 		  if (inattribute)
3359 		    break;
3360 		  if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
3361 		    {
3362 		      fvextern = FALSE;
3363 		      fvdef = fvnone;
3364 		    }
3365 		  continue;

Event new_values: Conditional "c == 47"
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3366 		case '/':
3367 		  if (*lp == '*')
3368 		    {
3369 		      lp++;
3370 		      incomm = TRUE;
3371 		      continue;
3372 		    }
3373 		  else if (/* cplpl && */ *lp == '/')
3374 		    {

Event const: After this line, the value of "c" is equal to 0
Event assignment: Assigning "0" to "c"
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][new_values][const][const][assignment][const][equality_cond][const][const][const]

3375 		      c = '\0';
3376 		      break;
3377 		    }
3378 		  else
3379 		    break;

Event new_values: Conditional "c == 37"
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]

3380 		case '%':
3381 		  if ((c_ext & YACC) && *lp == '%')
3382 		    {
3383 		      /* Entering or exiting rules section in yacc file. */
3384 		      lp++;
3385 		      definedef = dnone; fvdef = fvnone; fvextern = FALSE;
3386 		      typdef = tnone; structdef = snone;
3387 		      midtoken = inquote = inchar = incomm = quotednl = FALSE;
3388 		      bracelev = 0;
3389 		      yacc_rules = !yacc_rules;
3390 		      continue;
3391 		    }
3392 		  else
3393 		    break;
3394 		case '#':
3395 		  if (definedef == dnone)
3396 		    {
3397 		      char *cp;
3398 		      bool cpptoken = TRUE;
3399 	
3400 		      /* Look back on this line.  If all blanks, or nonblanks
3401 			 followed by an end of comment, this is a preprocessor
3402 			 token. */
3403 		      for (cp = newlb.buffer; cp < lp-1; cp++)
3404 			if (!iswhite (*cp))
3405 			  {
3406 			    if (*cp == '*' && *(cp+1) == '/')
3407 			      {
3408 				cp++;
3409 				cpptoken = TRUE;
3410 			      }
3411 			    else
3412 			      cpptoken = FALSE;
3413 			  }
3414 		      if (cpptoken)
3415 			definedef = dsharpseen;
3416 		    } /* if (definedef == dnone) */
3417 		  continue;
3418 		case '[':
3419 		  bracketlev++;
3420 		    continue;
3421 		} /* switch (c) */
3422 	
3423 	
3424 	      /* Consider token only if some involved conditions are satisfied. */
3425 	      if (typdef != tignore
3426 		  && definedef != dignorerest
3427 		  && fvdef != finlist
3428 		  && templatelev == 0
3429 		  && (definedef != dnone
3430 		      || structdef != scolonseen)
3431 		  && !inattribute)
3432 		{
3433 		  if (midtoken)
3434 		    {
3435 		      if (endtoken (c))
3436 			{

Event const: After this line, the value of "c" is equal to 32
Event equality_cond: Cond "c == 58" evaluated as false
Also see events: [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][new_values][const][const][assignment][const][equality_cond][const][const][const]

3437 			  if (c == ':' && *lp == ':' && begtoken (lp[1]))
3438 			    /* This handles :: in the middle,
3439 			       but not at the beginning of an identifier.
3440 			       Also, space-separated :: is not recognised. */
3441 			    {
3442 			      if (c_ext & C_AUTO) /* automatic detection of C++ */
3443 				c_ext = (c_ext | C_PLPL) & ~C_AUTO;
3444 			      lp += 2;
3445 			      toklen += 2;
3446 			      c = lp[-1];
3447 			      goto still_in_token;
3448 			    }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Problem report #3
  2006-04-30 16:42 Problem report #3 Dan Nicolaescu
@ 2006-05-01 20:27 ` Stuart D. Herring
  0 siblings, 0 replies; 2+ messages in thread
From: Stuart D. Herring @ 2006-05-01 20:27 UTC (permalink / raw)
  Cc: emacs-devel

> 3258 	  while (!feof (inf))
> 3259 	    {
> 3260 	      c = *lp++;
>
> Event equality_cond: Cond "c == 92" evaluated as false
> 3261 	      if (c == '\\')
> 3262 		{
> 3263 		  /* If we are at the end of the line, the next character is a
> 3264 		     '\0'; do not skip it, because it is what tells us
> 3265 		     to read the next line.  */
> 3266 		  if (*lp == '\0')
> 3267 		    {
> 3268 		      quotednl = TRUE;
> 3269 		      continue;
> 3270 		    }
> 3271 		  lp++;
>
> Event assignment: Assigning "32" to "c"
> Event const: After this line, the value of "c" is equal to 32
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][new_values][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]
>
> 3272 		  c = ' ';

This is odd; it seems to say that the if fails, but it still notices and
uses the constant value 32 assigned to c only if that test passes.

> 3337 	      else switch (c)
> 3338 		{
>
> Event new_values: Conditional "c == 34"

Now it seems to be concerned that additional values for c that are never
generated are checked for.  But of course *lp++ can evaluate to anything,
so this is not an issue.

> 3339 		case '"':
> 3340 		  inquote = TRUE;
> 3341 		  if (inattribute)
> 3342 		    break;
> 3343 		  switch (fvdef)
> 3344 		    {
> 3345 		    case fdefunkey:
> 3346 		    case fstartlist:
> 3347 		    case finlist:
> 3348 		    case fignore:
> 3349 		    case vignore:
> 3350 		      break;
> 3351 		    default:
> 3352 		      fvextern = FALSE;
> 3353 		      fvdef = fvnone;
> 3354 		    }
> 3355 		  continue;
>
> Event new_values: Conditional "c == 39"
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]
>
> 3356 		case '\'':
> 3357 		  inchar = TRUE;
> 3358 		  if (inattribute)
> 3359 		    break;
> 3360 		  if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
> 3361 		    {
> 3362 		      fvextern = FALSE;
> 3363 		      fvdef = fvnone;
> 3364 		    }
> 3365 		  continue;
>
> Event new_values: Conditional "c == 47"
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]
>
> 3366 		case '/':
> 3367 		  if (*lp == '*')
> 3368 		    {
> 3369 		      lp++;
> 3370 		      incomm = TRUE;
> 3371 		      continue;
> 3372 		    }
> 3373 		  else if (/* cplpl && */ *lp == '/')
> 3374 		    {
>
> Event const: After this line, the value of "c" is equal to 0
> Event assignment: Assigning "0" to "c"
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][new_values][const][const][assignment][const][equality_cond][const][const][const]
>
> 3375 		      c = '\0';
> 3376 		      break;
> 3377 		    }
> 3378 		  else
> 3379 		    break;
>
> Event new_values: Conditional "c == 37"
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][const][const][const][assignment][const][equality_cond][const][const][const]
>
> 3380 		case '%':
> 3381 		  if ((c_ext & YACC) && *lp == '%')
> 3382 		    {
> 3383 		      /* Entering or exiting rules section in yacc file. */
> 3384 		      lp++;
> 3385 		      definedef = dnone; fvdef = fvnone; fvextern = FALSE;
> 3386 		      typdef = tnone; structdef = snone;
> 3387 		      midtoken = inquote = inchar = incomm = quotednl = FALSE;
> 3388 		      bracelev = 0;
> 3389 		      yacc_rules = !yacc_rules;
> 3390 		      continue;
> 3391 		    }
> 3392 		  else
> 3393 		    break;
> 3394 		case '#':
> 3395 		  if (definedef == dnone)
> 3396 		    {
> 3397 		      char *cp;
> 3398 		      bool cpptoken = TRUE;
> 3399
> 3400 		      /* Look back on this line.  If all blanks, or nonblanks
> 3401 			 followed by an end of comment, this is a preprocessor
> 3402 			 token. */
> 3403 		      for (cp = newlb.buffer; cp < lp-1; cp++)
> 3404 			if (!iswhite (*cp))
> 3405 			  {
> 3406 			    if (*cp == '*' && *(cp+1) == '/')
> 3407 			      {
> 3408 				cp++;
> 3409 				cpptoken = TRUE;
> 3410 			      }
> 3411 			    else
> 3412 			      cpptoken = FALSE;
> 3413 			  }
> 3414 		      if (cpptoken)
> 3415 			definedef = dsharpseen;
> 3416 		    } /* if (definedef == dnone) */
> 3417 		  continue;
> 3418 		case '[':
> 3419 		  bracketlev++;
> 3420 		    continue;
> 3421 		} /* switch (c) */
> 3422
> 3423
> 3424 	      /* Consider token only if some involved conditions are
> satisfied. */
> 3425 	      if (typdef != tignore
> 3426 		  && definedef != dignorerest
> 3427 		  && fvdef != finlist
> 3428 		  && templatelev == 0
> 3429 		  && (definedef != dnone
> 3430 		      || structdef != scolonseen)
> 3431 		  && !inattribute)
> 3432 		{
> 3433 		  if (midtoken)
> 3434 		    {
> 3435 		      if (endtoken (c))
> 3436 			{
>
> Event const: After this line, the value of "c" is equal to 32
> Event equality_cond: Cond "c == 58" evaluated as false
> Also see events:
> [dead_error_line][dead_error_condition][new_values][equality_cond][assignment][new_values][new_values][new_values][const][const][assignment][const][equality_cond][const][const][const]
>
> 3437 			  if (c == ':' && *lp == ':' && begtoken (lp[1]))

And finally it's assuming its value of 32 for c, when there's no guarantee
of that at all.  So there's no bug here that I can see.

Davis

-- 
This product is sold by volume, not by mass.  If it appears too dense or
too sparse, it is because mass-energy conversion has occurred during
shipping.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-05-01 20:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-30 16:42 Problem report #3 Dan Nicolaescu
2006-05-01 20:27 ` Stuart D. Herring

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).