最近总结的安全编程注意要点
2008-07-24 16:04
405 查看
一、空指针问题
1、指针在使用前没有做为空判断,导致程序Crash
2、指针在new之后没有判断是否new成功
3、类成员指针没有初始化,却在析构函数中判断是否为空并删除
二、内存越界问题
内存越界导致的问题往往比空指针来得更严重,因为有很高的几率可能导致死机。
以下是我们采取的解决方案:
wsprintf 和 sprintf 一律使用 _snwprintf 和 _snprintf 代替
memcpy 尽量使用 SafeMemCopy 代替
SafeMemCopy 的实现如下:
#define SAFEMEMCPY_SUC 0
#define SAFEMEMCPY_LENGTH_ERROR 1
#define SAFEMEMCPY_POINTNULL_ERROR 2
inline int SafeMemCopy(void* pDest, size_t lenDest, const void* pSource, size_t lenSource)
{
if(lenSource > lenDest)
{
return SAFEMEMCPY_LENGTH_ERROR;
}
if((NULL == pDest) || (NULL == lenSource))
{
return SAFEMEMCPY_POINTNULL_ERROR;
}
memcpy(pDest, pSource, lenSource);
return SAFEMEMCPY_SUC;
}
三、 内存泄露
1、 删除指针数组时,容易忘记删除数组中指针指向的空间,造成内存泄露
2、 在WM下构造字体,创建画笔等资源,在使用后忘记删除,造成内存泄露。建议少使用HFont,HPen等句柄方式,而采用CFont, CPen等
3、 在执行逻辑复杂,拥有多处返回的函数中,往往容易在函数返回时忘记删除指针,造成泄露。建议多使用智能指针。
四、 内存浪费
1、 在存在继承关系的地方。除非确定的确属于公有的部分,否则不要将多余成员放置到基类中
2、 使用量比较大的结构体尽量不要采用一个最大长度的数组在存储内容,建议改为指针和长度表示
1、指针在使用前没有做为空判断,导致程序Crash
2、指针在new之后没有判断是否new成功
3、类成员指针没有初始化,却在析构函数中判断是否为空并删除
二、内存越界问题
内存越界导致的问题往往比空指针来得更严重,因为有很高的几率可能导致死机。
以下是我们采取的解决方案:
wsprintf 和 sprintf 一律使用 _snwprintf 和 _snprintf 代替
memcpy 尽量使用 SafeMemCopy 代替
SafeMemCopy 的实现如下:
#define SAFEMEMCPY_SUC 0
#define SAFEMEMCPY_LENGTH_ERROR 1
#define SAFEMEMCPY_POINTNULL_ERROR 2
inline int SafeMemCopy(void* pDest, size_t lenDest, const void* pSource, size_t lenSource)
{
if(lenSource > lenDest)
{
return SAFEMEMCPY_LENGTH_ERROR;
}
if((NULL == pDest) || (NULL == lenSource))
{
return SAFEMEMCPY_POINTNULL_ERROR;
}
memcpy(pDest, pSource, lenSource);
return SAFEMEMCPY_SUC;
}
三、 内存泄露
1、 删除指针数组时,容易忘记删除数组中指针指向的空间,造成内存泄露
2、 在WM下构造字体,创建画笔等资源,在使用后忘记删除,造成内存泄露。建议少使用HFont,HPen等句柄方式,而采用CFont, CPen等
3、 在执行逻辑复杂,拥有多处返回的函数中,往往容易在函数返回时忘记删除指针,造成泄露。建议多使用智能指针。
四、 内存浪费
1、 在存在继承关系的地方。除非确定的确属于公有的部分,否则不要将多余成员放置到基类中
2、 使用量比较大的结构体尽量不要采用一个最大长度的数组在存储内容,建议改为指针和长度表示
相关文章推荐
- Linux下Socket编程中注意的几个问题及要点总结
- 从网上看到一些文章,自己再总结一下,在学习编程中一些要点
- ISDN 注意事项、学习要点及其总结
- 基于linux下的C编程基础篇注意事项总结
- [Flex]Flex编程注意之性能优化、垃圾回收的一些总结
- Flex编程注意之性能优化、垃圾回收的一些总结
- MAC内核编程指南-安全注意事项
- 单片机裸机编程注意事项总结
- [总结]嵌入式高效C编程要点
- Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)
- Cisco 基本操作注意事项、学习要点及其总结
- DDR 注意事项、学习要点及其总结
- 微信支付相关流程(总结下最近做微信支付时需要注意的部分)
- JAVA高级05--网络编程--要点总结
- PL/SQL编程要点和注意点
- C++ 编程 注意要点
- C#提高编程能力的50个要点总结
- Ajax发送与返回数据格式注意的要点总结
- 寒江独钓-Windows内核安全编程总结
- CERT最近发布了Android平台上Java应用的安全编程指南