您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-22 21:15 555 查看

子程序

引入中间、易懂的抽象

避免代码的重复

子类化

隐藏顺序(合并需要顺序的操作)

隐藏指针的操作

提高可移植性

子程序长度:50~150

子程序的参数

输入,修改,输出的顺序

子程序的个数在7个之内

防御性编程

非法数据的破坏

外部数据值

子程序输入参数值

如何处理错误

断言

assert用来捕捉的是程序员自己的错误。永远不应该发生的错误

exception捕捉的是用户或者环境的错误。捕捉预期会发生的事情。

不要将需要执行的代码放入断言

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

c语言的错误处理

<assert.h>

检查输入参数的合理性

// 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++异常处理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: