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

posted @ 2016-02-26 22:09  dzqabc  阅读(1)  评论(0编辑  收藏  举报