D- 스캔너는 D 소스 코드를 분석하는 도구입니다
먼저 모든 소스 코드가 있는지 확인하십시오. 프로젝트를 복제 한 후 git submodule update --init --recursive 실행하십시오.
D- 스캔너를 빌드하려면 RUN make (또는 Windows에서 Build.Bat 파일)를 실행하십시오. 2.066보다 오래된 프론트 엔드 버전의 -inline 플래그에서 빌드 시간이 다소 길어질 수 있으므로 빌드 스크립트에서 제거 할 수 있습니다. MakeFile에는 DMD 대신 이러한 컴파일러 중 하나를 컴파일하려면 "LDC"및 "GDC"대상이 있습니다. 설치하려면 생성 된 바이너리 ( "Bin"폴더에)를 $ 경로 어딘가에 놓으십시오.
테스트는 Dub과 함께 작동하지 않습니다. Linux 또는 OSX에서는 make test 로 테스트를 실행합니다. Windows에서는 build.bat test 로 테스트를 실행합니다.
> dub fetch dscanner && dub run dscannerDocker의 경우 설치가 필요하지 않습니다.
docker run --rm -v $( pwd ) :/src dlangcommunity/dscanner다음 예제는 HelloWorld.d라는 간단한 파일을 분석하고 있다고 가정합니다.
import std.stdio ;
void main ( string [] args)
{
writeln( " Hello World " );
}사용
dscanner lint source/인간 읽기 가능한 문제 목록을 보려면.
구성 파일을 사용하여 진단 유형을 활성화 / 비활성화 할 수 있습니다. 자세한 내용은 --config argument / dscanner.ini 파일을 확인하십시오. 팁 : D- 스캔너를 통합하는 일부 IDE에는 진단을 구성하거나 DSCANNER.INI 파일을 생성하는 데 도움이 될 수 있습니다.
사용
dscanner fix source/ 소스 디렉토리 내의 모든 수정 가능한 문제를 대화식으로 수정합니다. --applySingle 으로 호출하여 여러 자동 솔루션이없는 수정 사항을 자동으로 적용하십시오.
많은 D 편집자들이 이미 D- 스캔너와 함께 배송됩니다.
CLI / 도구 파르즈 가능한 출력 사용
dscanner -S source/
# or
dscanner --report source/ --report 스위치에는 모든 정보와 이미 미리 해결 된 자동 픽스를 계산하기위한 저렴한 가격과 아래 설명과 같이 --resolveMessage 스위치를 사용하여 해결 해야하는 오토 픽스의 이름을 포함합니다.
github 동작을위한 내장 형식이있는 -f / --errorFormat 사용하여 사용자 정의 형식을 지정할 수도 있습니다.
# for GitHub actions: (automatically adds annotations to files in PRs)
dscanner -S -f github source/
# custom format:
dscanner -S -f ' {filepath}({line}:{column})[{type}]: {message} ' source/주어진 위치 사용에 대한 자동 이슈 수정을 해결하려면
# collecting automatic issue fixes
# --resolveMessage <line>:<column> <filename>
dscanner --resolveMessage 11:3 file.d
# --resolveMessage b<byteIndex> <filename>
dscanner --resolveMessage b512 file.d
# <filename> may be omitted to read from stdin출력 JSON :
// list of available auto-fixes at the given location
[
{
"name" : " Make function const " ,
// byte range `[start, end)` what code to replace
// this is sorted by range[0]
"replacements" : [
// replace: range[0 ] < range[1], newText != ""
{ "range" : [ 10 , 14 ], "newText" : " const " },
// insert: range[0] == range[1], newText != ""
{ "range" : [ 20 , 20 ], "newText" : " auto " },
// remove: range[0] < range[1], newText == ""
{ "range" : [ 30 , 40 ], "newText" : " " },
]
}
]교체를 적용하기위한 알고리즘 :
foreach_reverse (r; replacements)
codeBytes = codeBytes[ 0 .. r.range[ 0 ]] ~ r.newText ~ codeBytes[r.range[ 1 ] .. $]; 교체는 겹치지 않으며, 오름차순 순서로 range[0] 별로 정렬됩니다. 여러 가지 다른 교체품을 결합 할 때 먼저 위의 알고리즘을 사용하여 적용하려면 먼저 range[0] 별로 정렬해야합니다.
"--tokencount"또는 "-t"옵션은 주어진 파일의 토큰 수를 인쇄합니다.
$ dscanner --tokenCount helloworld.d
20
"-imports"또는 "-i"옵션은 주어진 소스 파일에서 가져온 모듈 목록을 인쇄합니다.
$ dscanner --imports helloworld.d
std.stdio
"-i"인수 (가져 오기 위치)를 통과하면 D- 스캔너가 수입 된 모듈의 위치를 해결하려고 시도합니다.
$ dscanner --imports helloworld.d -I ~/.dvm/compilers/dmd-2.071.1-b2/src/phobos/ -I ~/.dvm/compilers/dmd-2.071.1-b2/src/druntime/src/
/home/brian/.dvm/compilers/dmd-2.071.1-b2/src/phobos/std/stdio.d
Docker를 사용할 때 가져 오기 위치를 맵핑해야합니다.
docker run --rm -v $(pwd):/src -v /usr/include/dlang/dmd:/d dlangcommunity/dscanner --imports helloworld.d -I/d
/d/std/stdio.d
"-RecursiveImports"옵션은 "-imports"와 유사합니다. 수입 수입 (및이를 재귀 적으로 등록한 것)을 제외하고는 "-imports"와 유사합니다. 재귀 수입 옵션은 올바르게 작동하기 위해 가져 오기 경로를 지정해야합니다.
제한 사항 :
version 또는 static if 에 사용되지 않을 수있는 가져 오기를 무시하지 않습니다."-syntaxcheck"또는 "-s"옵션은 주어진 소스 파일을 Lexing 또는 구문 분석하는 동안 발견 된 오류 또는 경고 목록을 인쇄합니다. 의미 분석을 수행하지 않으며 코드를 컴파일하지 않습니다. 오류 또는 경고의 형식은 "-errorformat"또는 "-f"옵션으로 구성 할 수 있습니다.
"-styleCheck"또는 "-s"옵션은 주어진 소스 파일, 주어진 폴더에 포함 된 소스 또는 현재 작업 디렉토리에 포함 된 소스에 대해 몇 가지 기본 정적 분석 검사를 실행합니다 (아무것도 제공되지 않은 경우). 오류 또는 경고의 형식은 "-errorformat"또는 "-f"옵션으로 구성 할 수 있습니다.
단위 테스트의 정적 검사는 관련이없는 경고를 일으킬 수 있습니다. 예를 들어,이 변수의 유형의 추론에 의해 템플릿 함수가 인스턴스화 될 수 있는지 확인하는 것이 목표라면 사용되지 않는 변수를 선언하는 것이 합법적입니다. 이러한 경우를 피하기 위해 "-skiptests"옵션을 전달할 수 있습니다.
기본적으로 모든 수표가 활성화됩니다. 구성 파일을 사용하여 개별 점검을 활성화하거나 비활성화 할 수 있습니다. 예를 들어 이러한 파일은 프로젝트의 루트 디렉토리입니다. dscanner --defaultConfig 실행하면 기본 구성 파일이 생성되고 파일 위치를 인쇄합니다. 기본값 또는 로컬 설정을 재정의하려는 경우 "---config"옵션을 사용하여 구성 파일의 경로를 지정할 수도 있습니다.
각 점검마다 세 가지 값이 가능합니다.
"disabled" : 점검이 수행되지 않습니다."enabled" : 점검이 수행됩니다."skip-unittest" : 점검은 수행되지만 단위 테스트에서는 수행되지 않습니다.다른 가치는 수표를 비활성화합니다.
"-skiptests"옵션은 "skip-unittest" 점검으로 각 "enabled" 확인을 변경하는 것과 같습니다.
max_line_length 문자보다 긴 줄입니다.final 속성이 사용되지만 이러한 맥락에서는 Noop입니다.@trusted 전체 범위에 적용되지 않는지 확인하십시오. 새로운 선언이 추가 될 때 전체 범위를 신뢰하는 것은 문제가 될 수 있으며 수동으로 신뢰할 수있는 것으로 확인되지 않은 경우 문제가 될 수 있습니다.goto 테스트 throw 1에서 시작 continue 각 if return 스위치 case break 루프 catch && , || ,? ?: 위시리스트의 열린 문제 목록을 참조하십시오.
"-report"옵션은 위의 정적 분석 확인 문서에 대한 JSON 보고서를 표준 출력에 씁니다. 이 파일은 일반적으로 여기에 위치한 Sonarqube의 D 플러그인에서 사용됩니다.
옵션 사용 "-reportformat SonarqubegenericiSsudata"Sonar-Scanner 지원 일반적인 문제 데이터 형식의 보고서를 작성할 수 있습니다.
$ dscanner --reportFormat sonarQubeGenericIssueData . > sonar-generic-issue-data.json
"sonar.externalissuesreportpaths"를 사용하여 Sonar-Project.properties의 보고서 파일 이름을 참조하십시오.
sonar.externalIssuesReportPaths=sonar-generic-issue-data.json
ACK, GREP 및 Silver Searcher는 기호 사용을 찾는 데 유용하지만 기호의 선언을 검색 할 때 신호 대 노이즈 비율이 그리 좋지 않습니다. "-검색"또는 "-d"옵션을 사용하면 기호 선언을 검색 할 수 있습니다. 예를 들어:
$ dscanner -d TokenStructure
./libdparse/src/std/lexer.d(248:8)
"-sloc"또는 "-l"옵션은 파일의 코드 줄 수를 인쇄합니다. 단순히 라인 브레이크 수를 인쇄하는 대신 세미콜론 수를 계산하는 반면, 경우, foreach, foreach_reverse, 기본값 및 파일의 케이스 토큰을 전환하는 경우, 그렇지 않은 경우, 그렇지 않으면, 다른, 다른, 다른, 다른, 다른, switch, switch, switch, switch, switch.
$ ./dscanner --sloc helloworld.d
2
"-Highlight"옵션은 주어진 소스 파일을 구문 하이라이트로 인쇄하여 표준 출력에 HTML을 인쇄합니다. CSS 스타일링은 기본적으로 태양열 색 구성표를 사용하지만 "--theme"옵션을 사용하여 사용자 정의 할 수 있습니다.
다음 테마를 사용할 수 있습니다.
solarized
solarized-dark
gruvbox
gruvbox-dark
예가 없습니다. 너무 많은 공간이 필요합니다
"-ctags"또는 "-c"옵션은 CTAGS 정보를 생성하여 표준 출력에 씁니다. 디렉토리 인수는 .d 및 .di 파일에 대해 재귀 적으로 스캔됩니다.
$ dscanner --ctags helloworld.d
!_TAG_FILE_FORMAT 2
!_TAG_FILE_SORTED 1
!_TAG_FILE_AUTHOR Brian Schott
!_TAG_PROGRAM_URL https://github.com/Hackerpilot/Dscanner/
main helloworld.d 3;" f arity:1
CTAGS 출력은 다음 태그 종류를 사용합니다.
CTAGS 형식에 대한 자세한 내용은 여기를 참조하십시오.
--etags , -e 및 --etagsAll 옵션은 EMACS 호환 태그 파일이 생성된다는 것을 제외하고는 --ctags 와 유사합니다. --etagsAll 옵션은 --etags 및 -e 생성 외에 개인 및 패키지 선언에 대한 태그를 생성합니다.
"-Outline"옵션은 주어진 D 소스 파일을 구문 분석하고 파일의 선언에 대한 간단한 개요를 stdout에 씁니다.
dscanner.ini 파일이 작업 디렉토리 또는 부모 중 하나에 위치하면 다른 구성 파일을 대체합니다.
최종 위치로서 D-Scanner는 $HOME/.config/dscanner/dscanner.ini 에 제공된 구성 파일을 사용합니다. 실행 --defaultConfig 재생하십시오.
--config 옵션을 사용하면 사용자 정의 구성 파일 경로를 사용할 수 있습니다.
"-ast"또는 "-xml"옵션은 주어진 소스 파일의 전체 초록 구문 트리를 XML 형식의 표준 출력에 덤프합니다.
$ dscanner --ast helloworld.d< module >
< declaration >
< importDeclaration >
< singleImport >
< identifierChain >
< identifier >std</ identifier >
< identifier >stdio</ identifier >
</ identifierChain >
</ singleImport >
</ importDeclaration >
</ declaration >
< declaration >
< functionDeclaration line = " 3 " >
< name >main</ name >
< type pretty = " void " >
< type2 >
void
</ type2 >
</ type >
< parameters >
< parameter >
< name >args</ name >
< type pretty = " string[] " >
< type2 >
< symbol >
< identifierOrTemplateChain >
< identifierOrTemplateInstance >
< identifier >string</ identifier >
</ identifierOrTemplateInstance >
</ identifierOrTemplateChain >
</ symbol >
</ type2 >
< typeSuffix type = " [] " />
</ type >
< identifier >args</ identifier >
</ parameter >
</ parameters >
< functionBody >
< blockStatement >
< declarationsAndStatements >
< declarationOrStatement >
< statement >
< statementNoCaseNoDefault >
< expressionStatement >
< expression >
< assignExpression >
< functionCallExpression >
< unaryExpression >
< primaryExpression >
< identifierOrTemplateInstance >
< identifier >writeln</ identifier >
</ identifierOrTemplateInstance >
</ primaryExpression >
</ unaryExpression >
< arguments >
< argumentList >
< assignExpression >
< primaryExpression >
< stringLiteral >Hello World</ stringLiteral >
</ primaryExpression >
</ assignExpression >
</ argumentList >
</ arguments >
</ functionCallExpression >
</ assignExpression >
</ expression >
</ expressionStatement >
</ statementNoCaseNoDefault >
</ statement >
</ declarationOrStatement >
</ declarationsAndStatements >
</ blockStatement >
</ functionBody >
</ functionDeclaration >
</ declaration >
</ module >더 읽기 쉬운 출력을 보려면 서식 스위치를 사용하여 xmllint를 통해 명령을 파이프하십시오.
$ dscanner --ast helloworld.d | xmllint --format -
dscanner.ini 에서 새로운 섹션 analysis.config.ModuleFilters 만들 수 있습니다. 이 선택 섹션에서는 선택적 필터링을 적용 해야하는 모든 점검에 대해 쉼표로 구분 된 포함 및 제외 선택기 목록을 지정할 수 있습니다. 이 주어진 선택기는 모듈 이름과 부분 일치 ( std. 또는 .foo. )에서 일치합니다. 또한 모든 선택기는 + (포함) - (제외)로 시작해야합니다. 제외 선택기는 모든 포함 작업자보다 우선합니다. 물론, 모든 점검마다 다른 선택기 세트는 다음과 같습니다.
[analysis.config.ModuleFilters]
final_attribute_check = " +std.foo,+std.bar "
useless_initializer = " -std. "몇 가지 예 :
+std. : std.+std.bitmanip,+std.json :이 두 모듈에 대해서만 점검을 적용합니다.-std.bitmanip,-std.json : 모든 모듈에 대한 수표를 적용하지만이 두 가지+.bar : 일치하는 모든 모듈 포함 .bar (예 : foo.bar , abcbarros )-etc. : .etc 에서 모든 모듈을 제외합니다+std,-std.internal : 내부 모듈을 제외하고 전체 std 포함