Fix awk linter and security concerns. (#1411)
* Fixed (g)awk linter * Made it secure, albeit less useful. * Added gawk handler; the cpplint one was not working? * Added gawk handler test. * added warning to gawk handler. * added gawk command callback test * added comment about --source * added back optional commandline option
This commit is contained in:
parent
05d39bc1a9
commit
92e6e4d1ba
4 changed files with 109 additions and 1 deletions
|
@ -12,7 +12,11 @@ function! ale_linters#awk#gawk#GetExecutable(buffer) abort
|
|||
endfunction
|
||||
|
||||
function! ale_linters#awk#gawk#GetCommand(buffer) abort
|
||||
" note the --source 'BEGIN ...' is to prevent
|
||||
" gawk from attempting to execute the body of the script
|
||||
" it is linting.
|
||||
return ale_linters#awk#gawk#GetExecutable(a:buffer)
|
||||
\ . " --source 'BEGIN { exit } END { exit 1 }'"
|
||||
\ . ' ' . ale#Var(a:buffer, 'awk_gawk_options')
|
||||
\ . ' ' . '-f %t --lint /dev/null'
|
||||
endfunction
|
||||
|
@ -21,6 +25,6 @@ call ale#linter#Define('awk', {
|
|||
\ 'name': 'gawk',
|
||||
\ 'executable_callback': 'ale_linters#awk#gawk#GetExecutable',
|
||||
\ 'command_callback': 'ale_linters#awk#gawk#GetCommand',
|
||||
\ 'callback': 'ale#handlers#cpplint#HandleCppLintFormat',
|
||||
\ 'callback': 'ale#handlers#gawk#HandleGawkFormat',
|
||||
\ 'output_stream': 'both'
|
||||
\})
|
||||
|
|
25
autoload/ale/handlers/gawk.vim
Normal file
25
autoload/ale/handlers/gawk.vim
Normal file
|
@ -0,0 +1,25 @@
|
|||
" Author: Anthony DeDominic <adedomin@gmail.com>
|
||||
" Description: Handle output from gawk's --lint option
|
||||
|
||||
function! ale#handlers#gawk#HandleGawkFormat(buffer, lines) abort
|
||||
" Look for lines like the following:
|
||||
" gawk: /tmp/v0fddXz/1/something.awk:1: ^ invalid char ''' in expression
|
||||
let l:pattern = '^.\{-}:\(\d\+\):\s\+\(warning:\|\^\)\s*\(.*\)'
|
||||
let l:output = []
|
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||
let l:ecode = 'E'
|
||||
if l:match[2] is? 'warning:'
|
||||
let l:ecode = 'W'
|
||||
endif
|
||||
call add(l:output, {
|
||||
\ 'lnum': l:match[1] + 0,
|
||||
\ 'col': 0,
|
||||
\ 'text': l:match[3],
|
||||
\ 'code': 0,
|
||||
\ 'type': l:ecode,
|
||||
\})
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
40
test/command_callback/test_gawk_command_callback.vader
Normal file
40
test/command_callback/test_gawk_command_callback.vader
Normal file
|
@ -0,0 +1,40 @@
|
|||
Before:
|
||||
Save g:ale_awk_gawk_executable
|
||||
Save g:ale_awk_gawk_options
|
||||
unlet! g:ale_awk_gawk_executable
|
||||
unlet! g:ale_awk_gawk_options
|
||||
|
||||
runtime ale_linters/awk/gawk.vim
|
||||
|
||||
After:
|
||||
Restore
|
||||
unlet! b:command_tail
|
||||
unlet! b:ale_awk_gawk_executable
|
||||
unlet! b:ale_awk_gawk_options
|
||||
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(The executable should be used in the command):
|
||||
AssertEqual
|
||||
\ 'gawk'
|
||||
\ . " --source 'BEGIN { exit } END { exit 1 }'"
|
||||
\ . ' ' . '-f %t --lint /dev/null',
|
||||
\ ale_linters#awk#gawk#GetCommand(bufnr(''))
|
||||
|
||||
let b:ale_awk_gawk_executable = '/other/gawk'
|
||||
|
||||
AssertEqual
|
||||
\ '/other/gawk'
|
||||
\ . " --source 'BEGIN { exit } END { exit 1 }'"
|
||||
\ . ' ' . '-f %t --lint /dev/null',
|
||||
\ ale_linters#awk#gawk#GetCommand(bufnr(''))
|
||||
|
||||
let b:ale_awk_gawk_executable = 'gawk'
|
||||
let b:ale_awk_gawk_options = '--something'
|
||||
|
||||
AssertEqual
|
||||
\ 'gawk'
|
||||
\ . " --source 'BEGIN { exit } END { exit 1 }'"
|
||||
\ . ' --something'
|
||||
\ . ' ' . '-f %t --lint /dev/null',
|
||||
\ ale_linters#awk#gawk#GetCommand(bufnr(''))
|
39
test/handler/test_gawk_handler.vader
Normal file
39
test/handler/test_gawk_handler.vader
Normal file
|
@ -0,0 +1,39 @@
|
|||
Before:
|
||||
runtime ale_linters/awk/gawk.vim
|
||||
|
||||
After:
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(gawk syntax errors should be parsed correctly):
|
||||
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 1,
|
||||
\ 'col': 0,
|
||||
\ 'text': "invalid char ''' in expression",
|
||||
\ 'code': 0,
|
||||
\ 'type': 'E',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 5,
|
||||
\ 'col': 0,
|
||||
\ 'text': 'unterminated string',
|
||||
\ 'code': 0,
|
||||
\ 'type': 'E',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 10,
|
||||
\ 'col': 0,
|
||||
\ 'text': "escape sequence `\u' treated as plain `u'",
|
||||
\ 'code': 0,
|
||||
\ 'type': 'W',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale#handlers#gawk#HandleGawkFormat(347, [
|
||||
\ "gawk: something.awk:1: BEGIN { system('touch aaaaaaaaa') }",
|
||||
\ "gawk: something.awk:1: ^ invalid char ''' in expression",
|
||||
\ 'gawk: something.awk:5: { x = "aaaaaaaaaaa',
|
||||
\ 'gawk: something.awk:5: ^ unterminated string',
|
||||
\ "gawk: something.awk:10: warning: escape sequence `\u' treated as plain `u'",
|
||||
\ ])
|
Reference in a new issue