1071d4279SBram Moolenaar" Vim compiler file 2071d4279SBram Moolenaar" Compiler: splint/lclint (C source code checker) 3071d4279SBram Moolenaar" Maintainer: Ralf Wildenhues <[email protected]> 4071d4279SBram Moolenaar" Splint Home: http://www.splint.org/ 5*5477506aSBram Moolenaar" Last Change: 2019 Jul 23 65c73622aSBram Moolenaar" $Revision: 1.3 $ 7071d4279SBram Moolenaar 8071d4279SBram Moolenaarif exists("current_compiler") 9071d4279SBram Moolenaar finish 10071d4279SBram Moolenaarendif 11071d4279SBram Moolenaarlet current_compiler = "splint" 12071d4279SBram Moolenaar 13071d4279SBram Moolenaarif exists(":CompilerSet") != 2 " older Vim always used :setlocal 14071d4279SBram Moolenaar command -nargs=* CompilerSet setlocal <args> 15071d4279SBram Moolenaarendif 16071d4279SBram Moolenaar 17071d4279SBram Moolenaarlet s:cpo_save = &cpo 18071d4279SBram Moolenaarset cpo-=C 19071d4279SBram Moolenaar 20071d4279SBram Moolenaar" adapt this if you want to check more than one file at a time. 21071d4279SBram Moolenaar" put command line options in .splintrc or ~/.splintrc 22*5477506aSBram MoolenaarCompilerSet makeprg=splint\ %:S 23071d4279SBram Moolenaar 24071d4279SBram Moolenaar" Note: when using the new array bounds checking flags: Each warning 25071d4279SBram Moolenaar" usually has several lines and several references to source code mostly 26071d4279SBram Moolenaar" within one or two lines (see sample warning below). The easiest way 27071d4279SBram Moolenaar" not to mess up file name detection and not to jump to all positions is 28071d4279SBram Moolenaar" to add something like 29071d4279SBram Moolenaar" -linelen 500 +boundscompacterrormessages 30071d4279SBram Moolenaar" to your .splintrc and 'set cmdheight=4' or more. 31071d4279SBram Moolenaar" TODO: reliable way to distinguish file names and constraints. 32071d4279SBram Moolenaar" 33071d4279SBram Moolenaar" sample warning (generic): 34071d4279SBram Moolenaar" 35071d4279SBram Moolenaar"foo.c:1006:12: Clauses exit with var referencing local storage in one 36071d4279SBram Moolenaar" case, fresh storage in other case 37071d4279SBram Moolenaar" foo.c:1003:2: Fresh storage var allocated 38071d4279SBram Moolenaar" 39071d4279SBram Moolenaar" sample warning (bounds checking): 40071d4279SBram Moolenaar" 41071d4279SBram Moolenaar"bounds.c: (in function updateEnv) 42071d4279SBram Moolenaar"bounds.c:10:5: Possible out-of-bounds store: 43071d4279SBram Moolenaar" strcpy(str, tmp) 44071d4279SBram Moolenaar" Unable to resolve constraint: 45071d4279SBram Moolenaar" requires maxSet(str @ bounds.c:10:13) >= maxRead(getenv("MYENV") @ 46071d4279SBram Moolenaar" bounds.c:6:9) 47071d4279SBram Moolenaar" needed to satisfy precondition: 48071d4279SBram Moolenaar" requires maxSet(str @ bounds.c:10:13) >= maxRead(tmp @ bounds.c:10:18) 49071d4279SBram Moolenaar" derived from strcpy precondition: requires maxSet(<parameter 1>) >= 50071d4279SBram Moolenaar" maxRead(<parameter 2>) 51071d4279SBram Moolenaar" A memory write may write to an address beyond the allocated buffer. (Use 52071d4279SBram Moolenaar" -boundswrite to inhibit warning) 53071d4279SBram Moolenaar 54071d4279SBram MoolenaarCompilerSet errorformat=%OLCLint*m, 55071d4279SBram Moolenaar \%OSplint*m, 568fef2ad6SBram Moolenaar \%f(%l\\,%c):\ %m, 57071d4279SBram Moolenaar \%*[\ ]%f:%l:%c:\ %m, 58071d4279SBram Moolenaar \%*[\ ]%f:%l:\ %m, 59071d4279SBram Moolenaar \%*[^\"]\"%f\"%*\\D%l:\ %m, 60071d4279SBram Moolenaar \\"%f\"%*\\D%l:\ %m, 61071d4279SBram Moolenaar \%A%f:%l:%c:\ %m, 62071d4279SBram Moolenaar \%A%f:%l:%m, 63071d4279SBram Moolenaar \\"%f\"\\, 64071d4279SBram Moolenaar \\ line\ %l%*\\D%c%*[^\ ]\ %m, 65071d4279SBram Moolenaar \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f', 66071d4279SBram Moolenaar \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f', 67071d4279SBram Moolenaar \%DMaking\ %*\\a\ in\ %f, 68e5f258ebSBram Moolenaar \%C\ %#%m 69071d4279SBram Moolenaar 70071d4279SBram Moolenaarlet &cpo = s:cpo_save 71071d4279SBram Moolenaarunlet s:cpo_save 72