3 # Copyright (c) 2010 Martin Decky
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
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.
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.
30 Wrapper for Clang static analyzer
44 print(prname
+ " <ROOT>")
47 "Run Clang on a jobfile"
49 inname
= os
.path
.join(root
, job
)
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?")
56 inf
= open(inname
, "r")
57 records
= inf
.read().splitlines()
60 for record
in records
:
61 arg
= jobfile
.parse_arg(record
)
66 print("Not enough jobfile record arguments")
74 options
= arg
[5].split()
76 srcfqname
= os
.path
.join(base
, srcfname
)
77 if (not os
.path
.isfile(srcfqname
)):
78 print("Source %s not found" % srcfqname
)
81 # Only C files are interesting for us
85 args
= ['clang', '-Qunused-arguments', '--analyze',
86 '-Xanalyzer', '-analyzer-opt-analyze-headers',
87 '-Xanalyzer', '-checker-cfref']
89 args
.extend(['-o', tgtfname
, srcfname
])
93 retval
= subprocess
.Popen(args
).wait()
102 if (len(sys
.argv
) < 2):
106 rootdir
= os
.path
.abspath(sys
.argv
[1])
107 config
= os
.path
.join(rootdir
, "HelenOS.config")
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.")
115 if (not clang(rootdir
, job
)):
117 print("Failed job: %s" % job
)
121 print("All jobs passed")
123 if __name__
== '__main__':