良好な符号化スタイルを身につける重要性


コードを書く時、良好なコードスタイルを身につけて、コードの品質を高めて、多くの抜け穴を避けることができて、コードのメンテナンスと拡張のために効率を高めることができます.次に、実際の作業で遭遇した不良符号化スタイルが引き起こした問題を例に、良好な符号スタイルの役割を説明する.
  • if文、for文は複数の文があるかどうかにかかわらず、カッコで囲まなければなりません.次の例は、if文のbody部分に複数の文が存在するためですが、カッコで囲まれていないため、rn->vinfo 0ビットNULLの場合、routeは前回の値を使用してentry変数に値を割り当て、データ異常を引き起こし、深刻な場合はプロセスが停止します.
  •           bug
    modify before:
    for (rn = ls_table_top (top->rt_network); rn; rn = ls_route_next (rn))
    {
        if (rn->vinfo0)
            route = RN_INFO (rn, RNI_DEFAULT);
        if(route && route->selected)
        {
            entry.prefixlen = rn->p->prefixlen;
            entry.prefix = *((PSP_ULONG *)(rn->p->prefix));
            entry.type = route->selected->type;
            entry.flags = route->selected->flags;
            entry.area_id = route->selected->area_id.s_addr;
            entry.cost = OSPF_PATH_COST(route->selected);
            if (CHECK_FLAG(route->selected->flags, OSPF_PATH_TYPE2))
            {
                entry.type2_cost = route->selected->type2_cost;
            }
            else
            {
                entry.type2_cost = 0;
            }
    
            /* Get the actual nexthop vector.  */
            vec = ospf_path_nexthop_vector (route->selected);
            for (i = 0; i < vector_max (vec); i++)
            {
                if ((nh = vector_slot (vec, i)))
                {
                    count++;
                    entry.nexthop.flags = nh->flags;
                    entry.nexthop.if_id = nh->if_id.s_addr;
                    entry.nexthop.nbr_id = nh->nbr_id.s_addr;
                    entry.nexthop.id = count;
                    entry.nexthop.oi_if_name[0] = '\0';
                    strncpy(entry.nexthop.oi_if_name, nh->oi->u.ifp->name,  
                           PSP_INTERFACE_NAMSIZ);
                    if(record && fn)
                    {
                        (*fn)(tid,record,&entry);
                    }			  
                }
            }
            vector_free (vec);
        }
    }
    modify after:
    for (rn = ls_table_top (top->rt_network); rn; rn = ls_route_next (rn))
    {
        if (rn->vinfo0)
        {
            route = RN_INFO (rn, RNI_DEFAULT);
            if(route && route->selected)
            {
                entry.prefixlen = rn->p->prefixlen;
                entry.prefix = *((PSP_ULONG *)(rn->p->prefix));
                entry.type = route->selected->type;
                entry.flags = route->selected->flags;
                entry.area_id = route->selected->area_id.s_addr;
                entry.cost = OSPF_PATH_COST(route->selected);
                if (CHECK_FLAG(route->selected->flags, OSPF_PATH_TYPE2))
                {
                    entry.type2_cost = route->selected->type2_cost;
                }
                else
                {
                    entry.type2_cost = 0;
                }
    
                /* Get the actual nexthop vector.  */
                vec = ospf_path_nexthop_vector (route->selected);
                for (i = 0; i < vector_max (vec); i++)
                {
                    if ((nh = vector_slot (vec, i)))
                    {
                        count++;
                        entry.nexthop.flags = nh->flags;
                        entry.nexthop.if_id = nh->if_id.s_addr;
                        entry.nexthop.nbr_id = nh->nbr_id.s_addr;
                        entry.nexthop.id = count;
                        entry.nexthop.oi_if_name[0] = '\0';
                        strncpy(entry.nexthop.oi_if_name, nh->oi->u.ifp->name, PSP_INTERFACE_NAMSIZ);
                        if(record && fn)
                        {
                            (*fn)(tid,record,&entry);
                        }			  
                    }
                }
                vector_free (vec);
            }
        }    
    }

    2.グローバル変数を定義するには、初期化することが望ましい.プログラムの実行中の不確実性を解消します.問題が発生して位置決めが悪く、制御可能であることを確認します.
    3.スレッドタスク関数returnを使用しないと、スレッドが終了します.
    static int fd = open("/dev/test", O_WRONLY, 0777);
    int recv_task(VOID)
    {
        int    iFlags = 0;
    	INT32  iRet = 0;
    	UINT8  Headbuf[PRI_HEADER_SIZE] = {0x0};
    	UINT8  Framebuf[SOCKET_BUF_SIZE] = {0x0};	
    	INT32  iRecvLen = 0;
    	UINT16 uDataLen = 0;
    	
    	while(1)
    	{		
    		 /*  socket fd     */
    		iFlags = fcntl(fd, F_GETFL, 0);
    		if(iFlags > 0)
    		{
    			printf("fcntl error, flags = [%d]
    ", iFlags); /* return, */ return ERROR; } /* socket fd */ iRet = fcntl(fd, F_SETFL, iFlags | O_NONBLOCK); if(0 > iRet) { printf("fcntl error, ret = [%d]
    ", iRet); return ERROR; } while(1) { /*to do something*/ } } return OK; }