1" Vim compiler file
2" Compiler:     splint/lclint (C source code checker)
3" Maintainer:   Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
4" Splint Home:	http://www.splint.org/
5" Last Change:  2005 Apr 21
6" $Revision: 1.3 $
7
8if exists("current_compiler")
9  finish
10endif
11let current_compiler = "splint"
12
13if exists(":CompilerSet") != 2		" older Vim always used :setlocal
14  command -nargs=* CompilerSet setlocal <args>
15endif
16
17let s:cpo_save = &cpo
18set cpo-=C
19
20" adapt this if you want to check more than one file at a time.
21" put command line options in .splintrc or ~/.splintrc
22CompilerSet makeprg=splint\ %
23
24" Note: when using the new array bounds checking flags:  Each warning
25" usually has several lines and several references to source code mostly
26" within one or two lines (see sample warning below).  The easiest way
27" not to mess up file name detection and not to jump to all positions is
28" to add something like
29"	-linelen 500 +boundscompacterrormessages
30" to your .splintrc and 'set cmdheight=4' or more.
31" TODO: reliable way to distinguish file names and constraints.
32"
33" sample warning (generic):
34"
35"foo.c:1006:12: Clauses exit with var referencing local storage in one
36"		       case, fresh storage in other case
37"   foo.c:1003:2: Fresh storage var allocated
38"
39" sample warning (bounds checking):
40"
41"bounds.c: (in function updateEnv)
42"bounds.c:10:5: Possible out-of-bounds store:
43"    strcpy(str, tmp)
44"    Unable to resolve constraint:
45"    requires maxSet(str @ bounds.c:10:13) >= maxRead(getenv("MYENV") @
46"    bounds.c:6:9)
47"     needed to satisfy precondition:
48"    requires maxSet(str @ bounds.c:10:13) >= maxRead(tmp @ bounds.c:10:18)
49"     derived from strcpy precondition: requires maxSet(<parameter 1>) >=
50"    maxRead(<parameter 2>)
51"  A memory write may write to an address beyond the allocated buffer. (Use
52"  -boundswrite to inhibit warning)
53
54CompilerSet errorformat=%OLCLint*m,
55	\%OSplint*m,
56	\%f(%l\\,%c):\ %m,
57	\%*[\ ]%f:%l:%c:\ %m,
58	\%*[\ ]%f:%l:\ %m,
59	\%*[^\"]\"%f\"%*\\D%l:\ %m,
60	\\"%f\"%*\\D%l:\ %m,
61	\%A%f:%l:%c:\ %m,
62	\%A%f:%l:%m,
63	\\"%f\"\\,
64	\\ line\ %l%*\\D%c%*[^\ ]\ %m,
65	\%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
66	\%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
67	\%DMaking\ %*\\a\ in\ %f,
68	\%C\ %#%m
69
70let &cpo = s:cpo_save
71unlet s:cpo_save
72