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