lsof -i 显示系统端口使用情况
ipcs -m 查看共享内存
crontab -l 查看定时任务
lscpu 查看cpu相关信息
ps ux 查看现有进程 (处理端口号占用情况)
cat /dev/random | od -x查看并产生真正的随机数 |
arch命令用于显示当前主机的硬件架构类型
设置空闲等待时间: TMOUT=0
环境变量 https://www.jianshu.com/p/ac2bc0ad3d74
arch
uname -r
uname -m
cat /etc/*release | head -1 |awk -F " " '{print $1}'
free -h
cat /proc/meminfo
df -h /目录
查找空间都被谁占用了,一般在磁盘空间不足时使用。
du -sk ./*|sort -n
查找文件夹里面的文件数量,在OS报警inode超标时检查。
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
vgdisplay
iostat -xdm 1
iostat -kdx 1
top -p `pidof 进程名` -Hb -n 1
查看线程数
ps -ux | grep '进程名' |grep -v 'grep'|awk '{print $2}' |xargs ps -Tp | grep '线程前缀'| wc -l
getconf PAGE_SIZE
lspci | grep Eth
查看网卡数据流量
sar -n DEV 1
sar -n DEV 1 100
sar -n DEV 1 1000
1 表示间隔1秒统计
sar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。
-n参数很有用,他有6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL ,其代表的含义如下: |
DEV显示网络接口信息。
EDEV显示关于网络错误的统计数据。
NFS统计活动的NFS客户端的信息。
NFSD统计NFS服务器的信息
SOCK显示套接字信息
ALL显示所有5个开关
taskset -pc [thread_id/process_id]
https://blog.csdn.net/test1280/article/details/87991302
fdisk -l
lsblk
cat /sys/module/nvme/version
cat /sys/module/nvme/version 和modinfo nvme查看驱动版本为1.0为开源
netstat -anop|grep 199
查询 systemctl status firewalld.service
禁用 systemctl disable firewalld.service
关闭 systemctl stop firewalld.service
service iptables status
lsof -n |grep deleted
解决办法: 找到对应的进程号,kill掉即可; https://blog.csdn.net/allway2/article/details/102546095
last reboot
who -b
///安装GCC7、GDB(使用devtoolset,会自动升级centos内核版本号)
sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-7-gcc.x86_64 devtoolset-7-gcc-c++.x86_64 devtoolset-7-gdb
echo "source /opt/rh/devtoolset-7/enable" >> /etc/profile
///安装llvm,clang(使用llvm-toolset,会自动升级centos内核版本号)
sudo yum install -y llvm-toolset-7
echo "source /opt/rh/llvm-toolset-7/enable" >> /etc/profile
///source使环境变量生效
source /etc/profile
gcc --version
g++ --version
make --version
gdb --version
///如果编译还报clang找不到,可尝试修改/etc/ld.so.conf文件为如下内容:
include ld.so.conf.d/*.conf
/usr/local/lib
/usr/local/lib64
/usr/lib64/clang-private
修改完成后执行ldconfig
///安装网络工具,并配置DNS
sudo yum install net-tools -y
///安装代码检查工具
yum install -y cppcheck valgrind cloc lcov
///更新yum源
cd /etc/yum.repos.d,备份原来的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum repolist
批量创建文件夹
mkdir -p $DATA/{archive,config,databasefiles,diagnose/{metadata,hardmachine},instance,local_filesystem,log/{run,trace,audit,alarm,alert,listener}}
addr2line这个工具,转换堆栈,有时候比实际堆栈差一行。
uptime
正常的系统load是个位数才是正常了,超过100的都可以认为是系统有瓶颈了
进行系统监视通常有三种方式:
一是通过系统本身提供的命令,如UNIX/Linux系统中的ps, last等;
二是通过系统记录文件查阅系统在特定时间内的运行状态;
三是集成命令、文件记录和可视化技术的监控工具,如Windows的Perform。
https://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html
\w* 表示任意
参考链接:
C语言正则表达式详解 regcomp() regexec() regfree()详解
2.blog.csdn.net/Qiuoooooo/article/details/55050048
C中使用正则表达式验证email地址和IP地址
3.www.cplusplus.com/reference/regex/regex_match/
std::regex_match
4.blog.csdn.net/l357630798/article/details/78235307
Cpp标准库之 std::regex 类的使用
https://blog.51cto.com/waleon/5743410
依赖:分为so依赖和.h依赖
模块依赖:回调
说明:
在正确的做法中,函数与函数之间有且仅有一行空行,文件尾有且仅有一行空行。
说明:
魔鬼数字的定义是:在代码中没有具体含义的数字、字符串。魔鬼数字主要影响了代码可读性, 阅读者可能无法理解字符的含义, 从而难以理解程序的意图。当程序中的魔鬼数字过多时,代码的可维护性将会下降。
说明:
不要使用短时间内难以明白的技巧性很高的语句,高技巧的语句不一定是高效率的,高效率的关键在于算法设计本身。
说明:
默认的优先级可能与程序设计的思路或思想不符合导致出错。
说明:
程序文件、头文件、源文件的命名采用小写加下划线的形式,注意命名应与文件功能高度匹配。
说明:
goto语句是一种无条件转移语句,goto语句的使用格式为:goto 语句标号。执行goto语句后,程序将跳转到该标号处并执行其后的语句。goto语句会扰乱程序逻辑,使程序的可读性变差。
说明:
通用的缩写的使用应该参考abbr.md。程序中用于处理逻辑的语句应该少用缩写,不用无意义和无法理解的缩写,同一单词保持一致的缩写。
说明:增强程序的可读性。
说明:
增强程序的可读性。
说明:
#define
发生在预处理阶段采用符号直接替换原则,不能进行参数有效性的测试。当设计这方面代码出错,有时候会令人费解。对于单纯常量,最好以const
对象替代#difine
,对于形似函数的宏,最好改用inline
函数替换#define
说明:
宏只是简单的代码替换,不会像函数一样先将参数计算后,再传递。在使用带参数的宏的时候要注意:所有的参数都加括号,然后整个表达式在加上一个括号
说明:
为了不遗漏调用函数返回的错误信息,从而导致遗漏相关错误处理。需要对全面地对错误码进行处理。
说明:
用户输入的合法性通常难以保证,因为存在恶意攻击和误操作导致的非法输入,因此通常需要校验来保证安全,特别是当用户输入作为循环条件、数组下标、格式化字符串、拼装sql语句等情况。
说明:
统一规定由调用者负责检查参数合理性,避免遗漏合法性检查和重复检查造成冗余代码。
说明:
函数名应该尽量清晰明了,使用完整的单词或可以理解的缩写,避免产生误解和歧义
说明:
函数设计的过多,会使得函数间的接口变得复杂,降低代码可读性,所以过小的函数和功能不明确的函数不需要单独存在。
说明:
一个函数最好只实现一个对应的功能,将没有关联的语句放在用一个函数中会导致函数职责不明确,难以理解
说明:
如果参数是指针型参数,且内容不会被修改,请定义为const类型,以避免指针在运行时被篡改。
说明:
inline
函数带来的运行效率提升是以代码膨胀为代价的,如果执行函数体内的代码的时间比函数调用的开销大,那么inline
的收益就会很小。此外,每一处inline
函数的调用都是以代码复制方式,将导致生成的可执行文件体积变大。
说明:
资源的申请和释放必须在同一逻辑层,谁申请,谁释放。请保持良好的资源释放习惯,避免出现内存泄露和资源泄露。
说明:
圈复杂度反应了一个模块判定结构的复杂程度,圈复杂度大说明该段程序代码的判断逻辑复杂,难以维护和测试。一般认为圈复杂度在10以下可认为代码质量较好,10到20可能需要拆分或重构。
圈复杂度的计算方法有很多,这里给出两种常用的计算方法,记圈复杂度为V(G)。
示例:
//下列代码的圈复杂度为 1(for) + 2(if) + 1 = 4
int find (int match)
{
for (int var in list) {
if (var == match && var != NAN) {
return var;
}
}
}
说明:
每级嵌套都会增加代码阅读的难度,因为需要记忆上下文代码的逻辑关系。对于超过5层的嵌套进行进一步的分解,保证代码可读性。
说明:
禁止在.c
文件中直接通过extern int foo(int input)
的写法来引用其他文件的函数和变量。这种写法会导致代码混乱,同时在函数改变时导致声明和定义不一致。
说明:
对于可能存在较多递归层数的函数,需要使用ANL_STACK_SAFE_CALL
添加栈保护,防止系统栈溢出。
说明:
在Release版本中DEBUG
宏的代码段会被直接去掉,如果其中包含业务逻辑,会导致相关的业务逻辑丢失,影响正常功能。
说明:
协议、接口、持久化等方面若存在差异,会导致release版本无法正常解析传入的变量。
说明:
如果某变量只在Debug模式下使用,但是未使用Debug声明,那么在Release版本中会成为一个未被引用的变量,会导致代码冗余,降低代码可读性。
说明:
执行结构体对齐后可以减少读取内存的次数,I/O操作耗时很高,通过对齐可以减少I/O操作
说明:
在代码中使用了许多XXXassist
、XXXinfo
格式的结构体,请谨慎命名结构体,避免名称混淆和混乱。
说明:
内存结构体要求8字节对齐,对于没有对齐的结构体,需要手动添加unused
。
说明:
COD_ASSERT
通过定义ifndef
,只在测试版本出现,最终发布版本不允许出现assert
函数
说明:
对于外部接口参数,必须进行合法性判断,严禁在API实现过程中产生crash。
说明:
某些函数在运行时结果可能会有变化,如果写死断言会导致程序运行时crash。
说明:
断言在release时并不会写入,在断言内不能包含任何主体逻辑(赋值,修改变量,内存申请等),否则会导致代码逻辑遗漏。
说明:
断言只能判断真假,并在假时宕掉,缺少一些异常处理。因此严禁简单地用断言来代替一些需要异常处理的逻辑。
在release版本应当不启用断言,这主要是为了防止运行时宕机。在COD_ASSERT
处已经实现了相关宏定义,因此只需要保证调用COD_ASSERT
即可。
说明:
变量在声明的时候,不要给变量赋无效的值。在实际需要给变量赋值的时候,再赋予相应的值。
说明:
当变量为常量的时候,应当要在变量声明前面加const
。这样可以提高代码的安全性、可读性和可维护性。
说明:
函数内的局部变量保存在栈中,局部变量过大的时候会导致栈空间不足,引起stackoverflow异常。
说明:
禁止未经评审增加全局变量和线程私有全局变量。
说明:
代码禁止使用malloc/realloc/alloca
系统函数分配内存。
说明:
在进行memcpy时,如果源内存区域[src, src + count)和目标内存区域[dst, dst + count)有重叠,同时src < dst < src + count时,就会发生内存覆盖问题。src给dst赋值不超过dst的偏移量时没有什么问题,但是一旦超过偏移量,由于前面的赋值操作已经将内存给改变了,然后再用改变过后的内存再给dst赋值,这就导致了前面内容复制重复了,也就是发生内存覆盖了。
说明:
switch
语句中需要强制加上default
分支,default
建议处理异常。
说明:
字符串的操作必须使用相应的安全函数库内定义的函数,如:strcpy_s
、strcat_s
和strtok_s
等。
说明:
当整数之间进行运算时,可能会超过整数的最大固定长度,导致整数溢出或反转,使得预期结果不符。 如果涉及到除法或者求余操作,必须确保除数不为0。
说明:
为了防止在整数表达式比较或赋值为一种更大的类型时,计算出的结果与预期不符。建议先用更大的类型对它进行求值。
说明:
位操作符(~、»、«、&、^、|)应该只用于无符号整型操作数
说明:
内存申请的大小可能来自于外部传入的参数,必须检查其合法性,防止非法地申请内存。
Commit:提交代码到本地仓库。
Fetch(pull):获取主仓库的更新,同步到个人本地仓库。
Merge:合并主仓库的代码和本地的开发代码。代码会自动合并,但如果有冲突,需手动合并代码解决冲突。
Push:提交代码到个人远程仓库。
Merge Request:在GitLab的个人主页,发起Merge Request请求将个人远程仓库代码合并到主仓库的对应分支。
Code Review:处理Merge Request请求,进行code review。如果一切正常,最终合并到主仓库,打Tag上线。如果有问题,则拒绝Merge Request,要求修改。
http://www.runoob.com/lua/lua-tutorial.html
lua是一个非常轻量级的脚本语言,它由C语言编写而成,可以很容易被C/C++代码调用,同时也可以很方便地反向调用C/C++函数,介于这样地特性,我们可以选择将Lua脚本嵌入应用程序中,从而为应用程序提供灵活地扩展性和功能定制,这便是Lua语言诞生地意义。
Lua是类C的,所以,他是大小写字符敏感的。
Lua版本低会导致精度缺失。
1.https://blog.csdn.net/u013625451/article/details/84644839
2.https://www.codingnow.com/2000/download/lua_manual.html
int main() { char a[10]; a[10] = 0; return 0; }
文件名保存为file1.c
执行cppcheck file1.c
输出Checking file1.c…
[file1.c:4]: (error) Array ’a[10]’ index 10 out of bounds
命令行方式:
cppcheck --force --enable=all --template vs -I ../../../inc -I ../../../inc/tinyxml . 2>err.txt
参数说明:
error
严重问题
warning
预防bug的一些建议
style
编码格式问题(未使用的函数, 冗余代码等)
performance
使代码更快的建议
github
https://github.com/danmar/cppcheck/releases
man手册
https://linux.die.net/man/1/cppcheck
Using STL algorithms with cppcheck