上に戻る
1       /************************************************************************/
2       /*******							*********/
3       /*******	1章.	register char counterは危険		*********/
4       /*******				初版	NEC通信システム	*********/			
5       /************************************************************************/
6       #include	"common.h"
7       /*------------------------------------------------------*/
8       /*  1.1 問題の基本型:	代入した値が入らない		*/	
9       /*------------------------------------------------------*/
10      static	void	basicsCharErr(void)
11      {
12      	unsigned char	uc ;	
13      	char		c1 ;	
14      	char		c2 ;	
15      			/************************************************/

/* 1/ 9 警告02/03: B:e11: unsigned ucharV=-1の様な記述有り,if(ucharV==-1)は成り立たず:uc = -1 ; ↓ c1 = 0xFF ; %%%*/

16 uc = -1 ; /* unsigned char に -1 を代入すると255になります*/

/* 2/ 9 警告01/03: B:e11: unsigned ucharV=-1の様な記述有り,if(ucharV==-1)は成り立たず:uc = -1 ; ↓ c1 = 0xFF ; %%%*/

17 c1 = 0xFF ; /* signed char に FF を代入すると -1になります*/

/* 3/ 9 警告01/01: A:e179: 暗黙の定数変換でoverflowが発生しました:c2 = 256 ; ↓ %%%*/

18 c2 = 256 ; /* char に256 を代入すると 0になります*/

19 /************************************************/ 20 printf("unsigned char に -1 を代入すると %d¥n",uc) ; 21 printf(" signed char に FF を代入すると %d¥n",c1) ; 22 printf(" char に256 を代入すると %d¥n",c2) ; 23 } 上に戻る 24 /*------------------------------------------------------*/ 25 /* 1.2 隠された問題: 予期した比較が成立しない */ 26 /*------------------------------------------------------*/ 27 static void maskedCharErr(void) 28 { 29 #define ERR (-1) 30 b_ubyte ret ;

/* 4/ 9 警告01/01: A:e21: -1?。0xFFFFffffU?。符号なしである事を強調調するには接尾子Uを付けて下さい。K&R2 A2.5.1:unsigned char u1 = -1 ; %%%*/

31 unsigned char u1 = -1 ;

/* 5/ 9 警告01/01: A:e173: unsigned typeでも大き過ぎる整数なので入り切りません:= 256 ; %%%*/

32 unsigned char u2 = 256 ;

33 /********************************************/ 34 /* 確かに代入したはずの値と等しくならない */ 35 /********************************************/

/* 6/ 9 警告03/03: B:e11: unsigned ucharV=-1の様な記述有り,if(ucharV==-1)は成り立たず:ret = ERR ; ↓ if(ret== ERR) { %%%*/

36 ret = ERR ;

/* 7/ 9 警告01/01: A:e83: BUGです。if(常時偽):ret = ERR ; ↓ if(ret== ERR) %%%*/

37 if(ret== ERR) {

38 printf("来ません。¥n") ; 39 } else { 40 printf("ret=%dとERR=%dは等しくありません¥n",ret,ERR) ; 41 } 42 /****************************/ 43 /* 意味の無いチェック */ 44 /****************************/

/* 8/ 9 警告01/02: A:e42: if文中に常に真となる条件があります:if((0 <= u1 && u1 <= 255) || %%%*/

45 if((0 <= u1 && u1 <= 255) ||

/* 9/ 9 警告02/02: A:e42: if文中に常に真となる条件があります:if((0 <= u1 && u1 <= 255) ||↓ (0 <= u2 && u2 <= 255)) { %%%*/

46 (0 <= u2 && u2 <= 255)) {

47 printf("この2行にわたる、 ¥n") ; 48 printf("やや複雑なif文は実は意味がありません。 ¥n") ; 49 printf("ここには常時来ます。 ¥n") ; 50 } 51 } 上に戻る