python写的C++源码文件安全检查
safecheck.py
# encoding: UTF-8 import sys import re #print ("脚本名:", sys.argv[0]) class MyClass(object): m_regs = [] def Add(self, reg) : return self.m_regs.append(reg) def search(self, str) : for reg in self.m_regs : result = reg.search(str) if result : return result return if len(sys.argv) <= 2: exit #print ("Path:", sys.argv[1]) strPath = sys.argv[1] strContent = "" file_object = open(strPath, "r") #print(file_object) strContent = file_object.read() # 将正则表达式编译成Pattern对象 #禁止保存容器的非const迭代器,即使部分容器这么用也不会出错。 pattern = MyClass() #pattern.Add(tmp) pattern.Add(re.compile(r"(?<!\:\:const_)iterator\s*[^\s\=]+\s*\=\s*[^\s\=]+(\.|->)end\(\)")) pattern.Add(re.compile(r"(?<!\:\:const_)reverse_iterator\s*[^\s]+\s*\=\s*[^\s]+(\.|->)rend\(\)")) #print (strContent) iContentLen = len(strContent) #方法/属性 作用 #match() 决定 RE 是否在字符串刚开始的位置匹配 #search() 扫描字符串,找到这个 RE 匹配的位置 #findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回 #finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None #match = pattern.search(strContent) #MatchObject 实例也有几个方法和属性;最重要的那些如下所示: #方法/属性 作用 #group() 返回被 RE 匹配的字符串 #start() 返回匹配开始的位置 #end() 返回匹配结束的位置 #span() 返回一个元组包含匹配 (开始,结束) 的位置 match = pattern.search(strContent) print("--- Module: %s (C++)"%strPath) if match: # 使用Match获得分组信息 #print (match.span(0)) #print (match.group()) iStart = match.start() count = -1 iContentLen2 = 0 for count,line in enumerate(open(strPath, "r")) : #print(count,line) iContentLen2 += len(line) if iContentLen2 > iStart : break count += 1 #print(count) iCount = 0 while iStart : if strContent[iStart] == '\n': iCount += 1 if iCount == 2: break iStart -= 1 iCount = 0 iEnd = match.end() while iEnd < iContentLen : if strContent[iEnd] == '\n': iCount += 1 if iCount == 2: break iEnd += 1 #print ("ok") #print(iStart) #print(iEnd) print (strContent[iStart : iEnd]) print ("%s(%d) : Warning 0: "%(strPath,count)) ### 输出 ### # hello file_object.close()
使用方法:
py safecheck.py a.cpp