LINT(1)

명칭
lint - C 프로그램의 검증을 실시한다

서식
lint [-abceghprvxzHFV] [-s | -t] [-i | -nu] [-D name[=def]] [-U name] [-I directory] [-L directory] [-l library] [-o outputfile] file ... lint [-abceghprvzHFV] [-s | -t] -C library [-D name[=def]] [-I directory] [-U name] file ...

해설
lint 유틸리티는, 지정된 C 의 프로그램 파일을 해석해, 버그의 가능성이 있는 부분, 이식성이 없다고 생각되는 부분, 혹은 쓸데없는 코드라고 생각되는 부분 의 검출을 시도합니다. 더해, lint 유틸리티는, C 컴파일러보다 엄밀한 형태 체크를 실시합니다. lint (은)는 최초의 국면으로 심볼 “lint” (을)를 정의해 C 프리프로세서를 기동합니다. 이것에 의해, 어느 의심스러운 코드 부분을 lint (으)로 변경 혹은 스킵 시킬 수가 있습니다. 그러므로, lint 하지만 체크하는 모든 코드에 대해서는, 심볼 lint (은)는 예약어(reserved word)로 간주해야 합니다.

현재 lint 하지만 지적하는 문제점은 이하의 것입니다. 도달하지 않는 문장, 선두로부터 들어가지 않는 루프, 선언했지만 사용하지 않는 변수, 정수치가 되는 논리식. 함수 호출에 관해서는 이하와 같은 모순점이 지적됩니다. 어느 값을 돌려주지만 다른 장소에서는 값을 돌려주지 않는 함수의 호출해, 인수의 개수가 변화하는 함수의 호출해, 함수측에서 상정하고 있지 않는 형태의 인수를 건네주는 함수 호출해, 반치를 사용하지 않는 함수 호출해, 반치가 없는 함수의 존재하지 않는 반치를 사용하고 있는 함수 호출.

파일명 인수 가운데, 말미가. c 그리고 끝나는 것은 C 의 원시 파일로 간주해집니다. 파일명이 .ln 그리고 끝나는 것은, 이전 lint (을)를 -i, -o 혹은 -C 옵션 첨부로 기동했을 때의 결과를 격납한 파일로 간주해집니다. .ln 파일은, cc(1) 하지만. c (으)로부터 생성하는 오브젝트 파일. o 에 상당합니다. lint 유틸리티는 또, -l 옵션에 의해 지정된 특별한 프로그램 라이브러리를 받아들입니다. 이것은, 프로그램 라이브러리 함수와 변수의 정의를 포함하는 것입니다.

lint 유틸리티는, 모든. c, .ln 파일과 llib-llibrary.ln (lint 프로그램 라이브러리) 파일을 받아, 그것들을 명령행으로 지정한 순서에 처리합니다. 디폴트에서는, lint (은)는 표준 C lint 프로그램 라이브러리 (llib-lc.ln) (을)를 파일 리스트의 마지막에 덧붙입니다. -i 옵션이 지정되어 있으면, .ln 파일은 무시됩니다. 또, -o 옵션 혹은 -i 옵션이 지정되어 있으면, llib-llibrary.ln 파일은 무시됩니다. -i 옵션이 지정되어 없으면, lint 의 2번째의 패스로 이 파일 리스트가 상호 일관성 체크에 이용됩니다. 이 때, 만약 문제 개소가 주어진 원시 파일로부터는 아니고 인클루드 파일의 하나로 발단하는 것이라면, 표시되는 원시 파일명의 뒤로 물음표를 붙일 수 있습니다.

옵션은 다음과 같습니다:

-a  long 형태 이외의 변수에 대한다 long 값의 대입을 보고합니다.

-aa -a 에 가세해 작은 형태에의 암묵의 형태 변환을 일으킨다 모든 정수치 대입을 보고합니다.

-b  도달 할 수 없다 break 문장을 보고합니다. 이 옵션은 디폴트에서는 유효하지는 않습니다. 왜냐하면, 대부분의 lex(1) 및 많은 yacc(1) 출력은 이러한 break 를 많이 포함하기 때문입니다.

-c  이식성에 문제가 있는 캐스트에 대해 보고합니다.

-e  enum 형태에 대한 부정 조작이나 enum 형태와 int 형간의 편성에 대해 보고합니다.

-g  gcc(1) 하지만 C 언어에 대해서 가고 있는 몇개의 확장 기능에 대한 경고를 억제합니다. 현재로서는, 이것에 해당하는 것은 이하의 것입니다. 자동 변수의 집합형 초기화식에 나타나는 비정수식, void 형에의 포인터에 대한 산술 조작, 사이즈가 0 의 구조체, 좌변치가 아닌 배열의 첨자 붙여 구형식의 함수 선언을 무효화하는 prototype 선언, long long 정수형. -g 옵션은 또, 키워드 asm 및 inline (을)를 유효하게 합니다 ( asm 및 inline 의 선두에 언더스코어를 붙인 키워드는 항상 이용 가능합니다).

-h  몇개의 발견적 테스트를 적용해 버그를 발견해, 스타일을 세련 해, 헛됨을 생략하는 것을 시도합니다.

-i  명령행의 각. c 파일에 대해서 .ln 파일을 생성합니다. 이러한 .ln 파일은 lint 의 최초의 패스의 결과에 지나지 않고, 함수간의 일관성 체크는 행해지지 않습니다.

-n  표준 프로그램 라이브러리에 대한 일관성 체크를 실시하지 않습니다.

-p  다른 C 방언에의 이식성에 관한 체크를 시도합니다.

-r  중복 한 선언이 발견되었을 경우, 전회의 선언의 위치를 보고합니다.

-s  엄밀한 ANSI C 모드로 체크합니다. ANSI C 로 필요하게 되는 경고 및 에러를 출력합니다. 종래의 C 와 ANSI C 로 다른 행동을 하는 구조에 대해서의 경고는 실시하지 않습니다. -s 옵션지정시는, 프리프로세서 매크로로서 __STRICT_ANSI__ 하지만 정의됩니다.

-t  종래의 C 모드로 체크합니다. 이 모드에서는 __STDC__ (은)는 정의되지 않습니다. 종래의 C 로 허가되지 않는 구조에 대해서 경고가 출력됩니다. 종래의 C 와 ANSI C 로 다른 행동을 하는 구조에 대해서의 경고는 억제됩니다. 머신 타입 (예: sun3 ) 및 머신 아키텍쳐 (예: m68k )(을)를 기술한 프리프로세서 매크로는, 선두 및 말미의 언더스코어 없음으로 정의됩니다. 키워드 const, volatile 및 signed (은)는 종래의 C 모드에서는 이용할 수 없습니다 (그러나, 선두에 언더스코어를 교부한 이제(벌써) 한편의 키워드는 여전히 이용 가능합니다).

-u  사용되고 있지만 정의되어 있지 않은, 혹은 정의되고 있지만 사용되어 있지 않다 함수 및 외부 변수에 대한 보고를 실시하지 않습니다 (이 기능은, 대규모 프로그램을 구성하는 일부의 파일에 대해서 lint (을)를 달리게 하는 경우에 향하고 있습니다).

-v  함수중의 미사용 인수에 관한 보고를 억제합니다.

-x  extern 선언으로 참조되고 있지만 한번도 사용되어 있지 않은 변수에 대해 보고합니다.

-z  정의되어 있지 않은 구조체에 관한 보고를 억제합니다 (예를 들면, 내용을 칸치 하지 않고 구조체에의 포인터를 이용하는 경우 등).

-C library
    llib-llibrary.ln (이)라는 이름의 lint 프로그램 라이브러리를 작성합니다. 이 프로그램 라이브러리는, 모든 입력 파일. c 및 .ln (으)로부터 만들어집니다. 이러한 파일에 포함되는 모든 광역 함수 및 광역 변수의 선언이 새롭게 만들어지는 프로그램 라이브러리에 써내진 후, lint 하 -l 옵션으로 지정된 프로그램 라이브러리를 포함한 모든 입력 파일에 대해서 상호 일관성의 체크를 실시합니다.

-D name[=def]
    cpp(1) (을)를 위해서(때문에) #define 지시문과 같게 해 매크로 name (을)를 정의합니다. 우변치가 지정되지 않는 경우, 매크로 name (은)는 1 으로 정의됩니다.

-I directory
    인클루드 파일을 검색하는 디렉토리 리스트에 directory (을)를 추가합니다.

-l library
    lint 프로그램 라이브러리 llib-llibrary.ln (을)를 인클루드 합니다.

-L directory
    lint 프로그램 라이브러리를 표준의 장소로부터 찾기 전에, directory 및 directory/lint 의 안을 찾습니다.

-F  파일의 패스명 전체를 표시합니다. lint 유틸리티는 통상, 패스를 제외한 파일명만을 표시합니다.

-H  만약 문제 개소가 인클루드 파일로 발단하는 것이라면, lint (은)는 원시 파일명으로 거기에 계속되는 물음표에 대신해 인클루드 파일명을 표시합니다.

-o outputfile
    출력 파일명을 outputfile (으)로 합니다. 출력 파일은 lint 의 2번째의 패스의 입력 파일이 되는 것입니다. -o 옵션은 단지, 이 파일을 지정된 이름으로 파일에 보존합니다. 동시에 -i 옵션도 지정되어 있으면, 이러한 파일은 일관성이 체크되지 않습니다. llib-llibrary.ln 파일을 작성하려면 , 여분의 메세지를 억제하기 위해(때문에), -u 옵션의 사용을 추천 합니다. lint 프로그램 라이브러리의 원시 파일이 단지 외부 인터페이스에 지나지 않는 경우는, -v 옵션을 이용하면(자) 편리합니다.

-U name
    프리프로세서가 정의하는 모든 매크로 name (을)를 없앱니다.

-V  제어 프로그램이 C 프리프로세서 및 lint 의 제1 및 제2 패스를 실행할 때의 명령행을 표시합니다.

  입력 문법
lint 의 제 1 패스는 표준적인 C 원시 파일을 읽어들입니다. lint 유틸리티는 이하와 같은 C 의 코멘트를 명령로서 인식합니다.

/* ARGSUSEDn */
    최초의 n 개의 인수 에 대해서만 사용 체크를 실시합니다. n (을)를 생략 하면(자) 0 으로 해석됩니다 (이 옵션은, 다음의 함수에 대해서 -v 옵션과 같은 기능을 합니다).

    /* CONSTCOND */ 또는 /* CONSTANTCOND */ 또는 /* CONSTANTCONDITION */ 다음의 식에 대한 정수 오퍼랜드에 관한 보고를 억제합니다.

    /* FALLTHRU */ 또는 /* FALLTHROUGH */ case 혹은 default label가 붙은 문장에의 fall through 에 관한 보고를 억제합니다. 이 지시문은 그러한 label의 직전에 둘 필요가 있습니다.

/* LINTLIBRARY */
    파일 선두에서, 이 파일중에서 정의되는 모든 함수 및 변수가 사용되고 있다 (와)과 마크 합니다. 또, 미사용의 함수 인수에 관한 보고도 실시하지 않습니다.

    /* LINTED [comment] */ 또는 /* NOSTRICT [comment] */ 미사용의 변수 혹은 함수에 관한 것을 제외해, 파일내에 닫은 문제점에 관한 경고를 억제합니다. 이 지시문은, lint 경고가 발생하는 장소의 직전의 행에 둘 필요가 있습니다.

/* LONGLONG */
    long long 정수형의 사용에 관한 보고를 억제합니다.

/* NOTREACHED */
    꾸짖어야 할 장소에 있어, 미도달 코드에 관한 보고를 억제합니다 (이 코멘트는 통상, exit(3) (와)과 같은 함수의 호출의 직후에 둡니다).

/* PRINTFLIKEn */
    lint (은)는 최초의 (n-1) 개의 인수를 보통으로 체크합니다. n 번째의 인수는 printf(3) 의 포맷 캐릭터 라인과 같게 해석되어 나머지의 인수를 체크하기 위해서 이용됩니다.

/* PROTOLIBn */
    만약 n 하지만 0 이 아니면, lint (은)는 함수 선언 prototype를 함수 선언으로서 취급합니다. 이 지시문은 /* LINTLIBRARY */ (와)과 함께 마셔 이용할 수가 있습니다. n 하지만 0 의 경우는, 함수 prototype는 통상 대로 취급됩니다.

/* SCANFLIKEn */
    lint (은)는 최초의 (n-1) 개의 인수를 보통으로 체크합니다. n 번째의 인수는 scanf(3) 의 포맷 캐릭터 라인과 같게 해석되어 나머지의 인수를 체크하기 위해서 이용됩니다.

/* VARARGSn */
    후속 하는 함수 선언에 대해, 인수 개수에 관한 통상의 체크를 억제합니다. 최초의 n 개의 인수의 데이터형이 체크됩니다. n 하지만 지정되지 않는 경우는 0 으로 해석됩니다.

-i 옵션 및 -o 옵션을 이용하면(자), 사람조의 C 원시 파일에 대해서 인크리멘탈에 lint (을)를 적용하는 것이 가능합니다. 일반적으로, 각 원시 파일에 대해서 -i 옵션 첨부로 lint (을)를 한 번 기동합니다. 이 때,. c 에 대응해 .ln 파일이 작성되어 그러한 원시 파일에 관한 모든 메세지가 표시됩니다. 모든 원시 파일에 대해서 개별의 lint 처리가 끝난 후, 모든 .ln 파일과 필요한 -llibrary 옵션을 붙여( -i 옵션 없음으로) 한번 더 lint (을)를 기동합니다. 여기서 파일간의 일관성에 관한 문제점이 표시됩니다. 이 방식은 make(1) (을)를 이용하면(자) 잘됩니다. make(1) (을)를 이용하면(자), 전회 원시 파일의 조가 lint 된 후, 수정이 있던 파일 에 대해서만 lint (을)를 기동할 수가 있습니다.

환경 변수

LIBDIR
    -l library 옵션으로 지정된 프로그램 라이브러리가 존재하는 디렉토리. 이 환경 변수가 정의되어 있지 않은 경우는, 프로그램 라이브러리 검색을 위해서(때문에) 디폴트 패스로 해서 /usr/libdata/lint 하지만 이용됩니다.

TMPDIR
    일시파일용의 패스는 통상, 이 환경 변수를 세트 하는 것으로 변경할 수 있습니다.

관련 파일
/usr/libexec/lint[12]
    프로그램
/usr/libdata/lint/llib-l*.ln
    미리 작성되고 있는 여러가지 lint 프로그램 라이브러리
/tmp/lint*
    일시파일

관련 항목
cc(1), cpp(1), make(1)

저자
Jochen Pohl

버그

exit(3) (이)나 longjmp(3) 및 돌아오지 않는 다른 함수는 올바르게 이해되지 않습니다. 이것들은 여러가지 부정 진단의 원인이 됩니다.

최초의 extern 선언 전에서만 이용되는 static 함수는, 미사용이다고 보고됩니다.

-o 옵션에 의해 만들어진 프로그램 라이브러리는, 후의 lint 실행으로 이용했을 경우, 프로그램 라이브러리 작성시에 보고된 어떤 종류의 에러가 재차 보고되어 프로그램 라이브러리 작성시에 이용한 오리지날의 원시 파일의 행 번호 및 파일명이 에러 메세지중에 표시되는 일이 있습니다. 그 때문에, lint 프로그램 라이브러리 작성에는 -C 옵션을 이용하는 것을 추천 합니다.