1. 除0错误,毁灭程度不高,易于排除。
int func(int a)
{
// 这一行中只要出现除法,一定要注意检查a的值。
return 3/a;
}
2. 结构对齐方式,毁灭程度稍高,但出现错误时易于重现。
struct stA
{
char a;
int b;
};
一般情况在一个程序中没什么问题,但是在不同的编译环境中,默认对齐方式有所改变时就特别头疼,感觉有点莫名其妙数据出了错误,
所以一般都保持默认对齐方式,特殊的地方要用
#pragma pack(push,1)
struct stA
{
char a;
int b;
};
#pragma pack( pop )
3 类型转换static_cast 和dynamic_cast 的使用,特别是在父转子时,一定要用 dynamic_cast 来检测转换是否可以成功
4.字符串复制和内存复制,memcpy比较简单,注意目标内存快大小不要小于源数据块大小
strcpy,strncpy等需要注意目标内存快是否够大,sprintf除了注意目标内存块大小还需要注意格式串的匹配性。
5.STL 使用时需要注意他本身是不支持多线程使用的,所以不要认为它是安全的,安全是要自己来保障的。在多动态链接库中使用时也要注意它究竟是在哪个DLL中分配内存,属于哪个进程,直接导出使用也不一定是安全的。
6.文件的读取和写入会失败的,所以要注意检查执行情况,不要认为他是一定可以读写成功的。
int func(int a)
{
// 这一行中只要出现除法,一定要注意检查a的值。
return 3/a;
}
2. 结构对齐方式,毁灭程度稍高,但出现错误时易于重现。
struct stA
{
char a;
int b;
};
一般情况在一个程序中没什么问题,但是在不同的编译环境中,默认对齐方式有所改变时就特别头疼,感觉有点莫名其妙数据出了错误,
所以一般都保持默认对齐方式,特殊的地方要用
#pragma pack(push,1)
struct stA
{
char a;
int b;
};
#pragma pack( pop )
3 类型转换static_cast 和dynamic_cast 的使用,特别是在父转子时,一定要用 dynamic_cast 来检测转换是否可以成功
4.字符串复制和内存复制,memcpy比较简单,注意目标内存快大小不要小于源数据块大小
strcpy,strncpy等需要注意目标内存快是否够大,sprintf除了注意目标内存块大小还需要注意格式串的匹配性。
5.STL 使用时需要注意他本身是不支持多线程使用的,所以不要认为它是安全的,安全是要自己来保障的。在多动态链接库中使用时也要注意它究竟是在哪个DLL中分配内存,属于哪个进程,直接导出使用也不一定是安全的。
6.文件的读取和写入会失败的,所以要注意检查执行情况,不要认为他是一定可以读写成功的。