用于保护pc-lint MISRA C输出的脚本

时间:2015-11-27 04:31:21

标签: python lint misra

我最近购买了一些源代码的试用版,以便在购买前检查MISRA合规性。我已经在C代码上运行了pc-lint来验证合规性,并且输出了大量的违规行为。我想要确定生成的html,以便我可以对违规行为进行排序。我已经尝试使用谷歌搜索已经存在的东西,但收益很少,所以我开始写一个python脚本...

简而言之,脚本多次遍历html输出的每一行,以便检查特定的字符串。当然这需要花费很长的时间来执行,我一直无法找到一个优雅的解决方案,但我希望我遗漏了一些明显有人可以指出的东西......否则,也许另一种语言会更合适会执行得更快。干杯!

#!/usr/bin/env python

import re
rule_search = re.compile("Required Rule (.*?),",re.DOTALL|re.M)
rule_search2 = re.compile("MISRA 2004 Rule (.*?)]",re.DOTALL|re.M)
line_search = re.compile("<br>(.*?)<br>",re.DOTALL|re.M)

data=open('lint-all.html').read()

unique_rules = list(set(rule_search.findall(data)))
unique_rules2 = list(set(rule_search2.findall(data)))

MISRA_Rules = unique_rules + unique_rules2
count = [0] * len(MISRA_Rules)

page_lines = {}     
pages = {}  

counts = open("pages/counts.html",'w')
counts.write("<h2>Violated Rules Count</h2><h3><ol>")
counts.close()
for i in range (len(MISRA_Rules)):
    pages[i] = open("pages/" + str(MISRA_Rules[i]).translate(None, '.') + ".html", 'w')
    pages[i].close()
    counts = open("pages/counts.html",'a+')
    counts.write("<a href=" + str(MISRA_Rules[i]).translate(None, '.') + ".html>" + str(MISRA_Rules[i]) + "</a>: <font size='3'> 0 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" )
    if i%4 == 0 and i != 0:
        counts.write("<br />")


counts.write("<br /><a href=sorted.html>Total:</a> " + "<font size='3'>" + str(count) + "</font>")
counts.write("</h3>")

for i in range (len(MISRA_Rules)):
    pages[i] = open("pages/" + str(MISRA_Rules[i]).translate(None, '.') + ".html", 'a+')
    pages[i].write("<h1>MISRA Rule " + str(MISRA_Rules[i]) + "</h1>")
    pages[i].write("""<link rel="import" href="counts.html">""")
    for j in range (len(line_search.findall(data))):
        if "Rule " + str(MISRA_Rules[i]) in line_search.findall(data)[j]:
            count[i] += 1
            pages[i].write("<br>")
            pages[i].write(line_search.findall(data)[j])
            pages[i].write("</br>")

print "out"

new_html = open('pages/sorted.html', 'w')

counts = """<h2>Violated Rules Count</h2><h3><ol>"""        
for i in range (len(MISRA_Rules)):
    counts += """<a href=""" + str(MISRA_Rules[i]).translate(None, '.') + ".html" +  """>""" + str(MISRA_Rules[i]) + """</a>: <font size="3">""" + str(count[i]) + """</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""
    if i%4 == 0 and i != 0:
        counts += """<br />"""


counts += """<br /><a href=sorted.html>Total:</a> """ + """<font size="3">""" + str(count) + """</font>"""
counts += """</h3>"""
counts.close()              
new_html.write(counts)

new_html.write(data)
new_html.close()

1 个答案:

答案 0 :(得分:0)

可能的几种方法。

首先是优化现有代码。很难说它出了什么问题。在这种情况下,可以转到cprofile个文档并设置一个分析器。那里你会看到瓶颈。

第二方法(最倾向于我的意见):在Python中解析数据,但将HTML生成留给专门的工具,例如jinja2模板引擎,它广泛用于Web开发。更简单的jinja2版本是mustache,很可能不需要任何安装。

第三种方法是在浏览器中执行所有这些操作。添加jQuery用于DOM操作(引入新标记和类)和css样式表(确定新标记和类应如何显示)。