source: mainline/tools/checkers/clang.py@ f4057f5

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since f4057f5 was f4057f5, checked in by Jiri Svoboda <jiri@…>, 15 years ago

Enough is enough (i.e. fix the spelling).

  • Property mode set to 100755
File size: 3.3 KB
Line 
1#!/usr/bin/env python
2#
3# Copyright (c) 2010 Martin Decky
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# - Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# - Redistributions in binary form must reproduce the above copyright
13# notice, this list of conditions and the following disclaimer in the
14# documentation and/or other materials provided with the distribution.
15# - The name of the author may not be used to endorse or promote products
16# derived from this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28#
29"""
30Wrapper for Clang static analyzer
31"""
32
33import sys
34import os
35import subprocess
36import jobfile
37
38jobs = [
39 "kernel/kernel.job"
40]
41
42def usage(prname):
43 "Print usage syntax"
44 print(prname + " <ROOT>")
45
46def clang(root, job):
47 "Run Clang on a jobfile"
48
49 inname = os.path.join(root, job)
50
51 if (not os.path.isfile(inname)):
52 print("Unable to open %s" % inname)
53 print("Did you run \"make precheck\" on the source tree?")
54 return False
55
56 inf = open(inname, "r")
57 records = inf.read().splitlines()
58 inf.close()
59
60 for record in records:
61 arg = jobfile.parse_arg(record)
62 if (not arg):
63 return False
64
65 if (len(arg) < 6):
66 print("Not enough jobfile record arguments")
67 return False
68
69 srcfname = arg[0]
70 tgtfname = arg[1]
71 tool = arg[2]
72 category = arg[3]
73 base = arg[4]
74 options = arg[5].split()
75
76 srcfqname = os.path.join(base, srcfname)
77 if (not os.path.isfile(srcfqname)):
78 print("Source %s not found" % srcfqname)
79 return False
80
81 # Only C files are interesting for us
82 if (tool != "cc"):
83 continue
84
85 args = ['clang', '-Qunused-arguments', '--analyze',
86 '-Xanalyzer', '-analyzer-opt-analyze-headers',
87 '-Xanalyzer', '-checker-cfref']
88 args.extend(options)
89 args.extend(['-o', tgtfname, srcfname])
90
91 cwd = os.getcwd()
92 os.chdir(base)
93 retval = subprocess.Popen(args).wait()
94 os.chdir(cwd)
95
96 if (retval != 0):
97 return False
98
99 return True
100
101def main():
102 if (len(sys.argv) < 2):
103 usage(sys.argv[0])
104 return
105
106 rootdir = os.path.abspath(sys.argv[1])
107 config = os.path.join(rootdir, "HelenOS.config")
108
109 if (not os.path.isfile(config)):
110 print("%s not found." % config)
111 print("Please specify the path to HelenOS build tree root as the first argument.")
112 return
113
114 for job in jobs:
115 if (not clang(rootdir, job)):
116 print
117 print("Failed job: %s" % job)
118 return
119
120 print
121 print("All jobs passed")
122
123if __name__ == '__main__':
124 main()
Note: See TracBrowser for help on using the repository browser.