一、代码检视
禁止使用异常规范。抛出非预期异常,会coredump,且gdb无错误信息。
YES:
void KVMap::SetValue(const string& key, int value);
NO :
void KVMap::SetValue(const string& key, int value) throw CException;
第三方库先用类简易封装,再使用,特别涉及资源释放的代码,要谨慎。
如:mysql_free_result(MYSQL_RES *);
if语句后必须带大括号{}。
YES:
if (totalCount == 0)
{
return;
}
NO:
if (totalCount == 0)
return;
注意向后兼容性,新增功能,不能影响存量代码功能
禁止不必要的对象、容器拷贝。
YES:
map kvmap;
map& kvmap1 = kvmap;
const map& kvmap2 = kvmap;
NO:
map kvmap;
map kvmap3 = kvmap;
尽量减少map的使用,特别是不要用来做函数参数
单行不要过长,超过一屏影响看代码
对后台功能封装要从后往前封装、命名,对前台业务要从前往后封装、命名。
用C++编写代码,涉及异常、指针、资源释放的时候,要特别打起精神 。
尽量避免使用宏定义
尽量避免使用模板
定义std::string变量,尽量不要定义char*变量
在throw异常前,记录ERROR日志,便于定位问题
二、内存指针管理/C++
对象A的生命周期可以分为3种,1).与函数的生命周期相同;2).与对象B的生命周期相同;3).与进程的生命周期相同。
按照对象的生命周期的种类,以及多个对象的情况,可以分以下四种情况来处理:
与函数的生命周期相同,用智能指针auto_ptr
与对象B的生命周期相同,在对象B的构造函数或初始化函数里new对象A,在对象的析构函数里delete对象B
与进程的生命周期相同,使用单例模式
列表存储多个new的对象,定义template class ObjectList,在析构函数里delete对象组
三、安全编程
网络安全五要素:
可用性 - 得到授权的实体在需要时可访问资源和服务
可鉴别性 - 身份认证
完整性 - 防篡改
保密性 - 信息的内容不会被未授权的第三方所知。
不可否认性 - 防抵赖
网络安全知识:
对称加密DES、3DES、AES,推荐:AES-CBC
对称加密分为分组加密和序列密码。
分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。
序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。
DES:Data Encryption Standard,数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。对称性加密一般会按照固定长度,把待加密字符串分成块。不足一整块或者刚好最后有特殊填充字符。往往跨语言做DES加密解密,经常会出现问题。往往是填充方式不对、或者编码不一致、或者选择加密解密模式(ECB, CBC, CTR, OFB, CFB, NCFB, NOFB)没有对应上造成。
3DES:又叫Triple DES,是三重数据加密算法。它相当于是对每个数据块应用三次DES加密算法。密钥长度是128位,192位(bit),如果密码位数少于等于64位,加密结果与DES相同。
AES:Advanced Encryption Standard,高级加密标准,是一种区块加密标准,用来替代原先的DES。AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特。
块加密常用加密模式ECB、CBC
ECB:Electronic Code Book,电子密码本模式,是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。缺点在于同样的明文块会被加密成相同的密文块;因此,它不能很好的隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议中。
CBC:Cipher Block Chaining,密文分组链接方式
由IBM于1976年发明,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量IV。
CBC是最为常用的工作模式,是SSL、IPSec的标准。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
非对称加密 RSA推荐RSA2048
公钥加密 + 私钥解密:用于加密数据,但效率低,适用于少量数据加密的场景,如交换对称密码。
私钥加密 + 公钥解密:用于身份认证 、签名
证书&CA
使用证书,要考虑证书过期如何更换等问题。
证书格式:
1).DER编码二进制X.509:
分布式编码规则(Distinguished Encoding Rules),
二进制
2).BASE64编码X.509:PEM格式:
增强型私人邮件(Privacy Enhanced Mail)
文本形式,DER格式经BASE64编码
3).pfx格式:
个人信息交换(Personal Information Exchange)
一种Microsoft协议,
以pkcs#12格式存储的证书和相应私钥
4).PKCS#7 :.p7b
加密消息语法标准(Cryptographic Message Syntax Standard)
MD5、SHA1、SHA256,推荐:SHA256
散列函数,用以提供消息的完整性保护,防止被篡改,
BASE64
BASE64是一种基于64个可打印字符来表示二进制数据的表示方法。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。
URL编码
URL编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。
URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。
XML编码、Json编码
为了防止脚本注入攻击。
四、网络编程
封装Socket,TCPClient, UDPClient,
五、线程编程 pthread
线程
封装Thread类,在子类实现对线程过程的封装
线程私有数据
使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由Posix线程库维护,称为线程私有数据(Thread-specificData,或TSD)。
锁
1)进程间互斥锁
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE);
2)进程间自旋锁
pthread_spin_init(spinlock, PTHREAD_PROCESS_SHARED);
3)优先使用互斥锁,如果对性能有进一步需求,可以尝试使用自旋锁
4)自旋锁是一种非阻塞锁,空转会耗cpu,有一定的适用场景
5)自旋锁适用于多核处理器,临界区运行时间很短的场景
6)互斥锁vs信号量
互斥锁没有任何顺序的保证,它仅仅是保护了资源,效率会比较高。
信号量则有顺序的保证,使得每个使用者都能依次获得他,但是相应的会损失一点效率。
条件变量
条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。
六、单元测试UnitTest
使用gtest
定义UnitTest基类,class UnitTest : public testing::Test
定义基类LibObjectTest,DAOTest,ClientTest,ServiceTest,CGITest,继承于UnitTest
定义具体单元测试类,如LoanDAOTest等
编译&执行测试用例
1)执行所有用例:
./unittest_main
2)执行单个用例:
./unittest_main --gtest_filter=StringUtilTest.TestSplit
3)执行部分用例:
./unittest_main --gtest_filter=StringUtilTest.*
七、自动生成文档的方法:
windows下安装以下软件,到默认路径 C:\Program Files
1) doxygen
2) graphviz
3) htmlhelp.exe
用doxyen, 打开pls_loan_server_doxyfile,修改以下配置
1) Expert - Project - OUTPUT_DIRECTORY: 输出目录(可相对路径)
2) Expert - Input - INPUT: 源码输入目录(可相对路径),可包含mainpage.h
3) Expert - HTML - CHM_FILE: chm文件名(必须是完整路径,否则无法生成chm)
4) Expert - HTML - HHC_LOCATION: htmlhelp安装目录,如C:\Program Files\HTML Help Workshop\hhw.exe
5) Expert - Dot - DOT_PATH: dot安装目录 如:C:/Program Files/Graphviz 2.28/bin/dot.exe
注:不支持中文目录
持续更新详见本公众号内:精选内容>>文章分类>>WeAP>>点位训练-开发编码(C++版)
欢迎关注交流,转发转载
您的关注和点赞,是我前进的动力
你的吐槽和质疑,是我创作的源泉
领取专属 10元无门槛券
私享最新 技术干货