代码规范_2:防御编码_c/c++

子程序

  • 引入中间、易懂的抽象
  • 避免代码的重复
  • 子类化
  • 隐藏顺序(合并需要顺序的操作)
  • 隐藏指针的操作
  • 提高可移植性
  • 子程序长度:50~150

子程序的参数

  • 输入,修改,输出的顺序
  • 子程序的个数在7个之内

防御性编程

非法数据的破坏

  • 外部数据值
  • 子程序输入参数值
  • 如何处理错误

断言

  • assert用来捕捉的是程序员自己的错误。永远不应该发生的错误
  • exception捕捉的是用户或者环境的错误。捕捉预期会发生的事情。
  • 不要将需要执行的代码放入断言

健壮的代码:先使用断言处理错误,再使用错误处理


c语言的错误处理

  • <assert.h> <script type="math/tex" id="MathJax-Element-1"> </script>
  • 检查输入参数的合理性
// crt_assert.c  
// compile with: /c  
#include <stdio.h>  
#include <assert.h>  
#include <string.h>  

void analyze_string( char *string );   // Prototype  

int main( void )  
{  
   char  test1[] = "abc", *test2 = NULL, test3[] = "";  

   printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );  
   analyze_string( test1 );  
   printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );  
   analyze_string( test2 );  
   printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );  
   analyze_string( test3 );  
}  

// Tests a string to see if it is NULL,   
// empty, or longer than 0 characters.  
void analyze_string( char * string )  
{  
   assert( string != NULL );        // Cannot be NULL  
   assert( *string != '\0' );       // Cannot be empty  
   assert( strlen( string ) > 2 );  // Length must exceed 2  
} 


//输出
Analyzing string 'abc'  
Analyzing string '(null)'  
Assertion failed: string != NULL, file assert.cpp, line 25  

abnormal program termination 

*例子

void* memcpy(void *dst, const void *src, size_t count)      
{      
    //安全检查  
    assert( (dst != NULL) && (src != NULL) );      

    unsigned char *pdst = (unsigned char *)dst;      
    const unsigned char *psrc = (const unsigned char *)src;      

    //防止内存重复  
    assert(!(psrc<=pdst && pdst<psrc+count));      
    assert(!(pdst<=psrc && psrc<pdst+count));      

    while(count--)      
    {      
        *pdst = *psrc;      
        pdst++;      
        psrc++;      
    }      
    return dst;      
}

error

  • 库函数的调用错误

assert的宏定义


c语言异常

  • C语言的异常机制 setjump longjump函数

c++异常处理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值