2009-03-21 6 views
6

변수를 선언 할 때 부목을 어떻게 무시할 수 있습니까?변수를 선언 할 때 부목을 어떻게 무시할 수 있습니까?

나는 모든 학교에서 이 시작될 때 변수를 선언하라고 알려줍니다. 이지만 나쁜 사람이기 때문에 내가 사용하는 곳과 가까운 곳에서 물건을 선언하고 싶습니다. 좋은 예는 int i를 넣는 것입니다. for (i = 0; ...) 바로 앞에.

#include <stdio.h> 
int main() 
{ 
    printf("Hello splint test\n"); 

    int i; 
    for(i=5;i>0;i--) 
    { 
     printf("%2d...\n",i); 
    } 

    return 0; 
} 
여기

부목 가장 오래된 C 컴파일러는 내가하는 int 이동하려는의 아주 간단한 예를 들어 보자; 한 줄 위로, 또는 선언과 for 루프를 {} 넣으십시오.

이제 질문에이 검사를 어떻게 해제합니까? 하지만 다른 수표는 잘 보관 하시겠습니까?

감사 요한


주 1 : 이미 두 번째로 방어, 및 Valgrind의 오프 첫 번째 라인으로 GCC 경고 (아래 참조)를 사용합니다. 그러나 나는 나의 어리 석음 ;-) 을 제어 할 수있는 것들을 내 목록에 부목을 추가하는 방법에 대해 생각하고 있어요 그러나이 검사는 단지 성가신,

gcc에 경고 내가 사용 -Wall -W -Wextra -Wconversion - Wshadow -Wcast-qual -Wwrite-strings -Werror

참고 2 : 나쁜 동작으로 인해 발생할 수있는 잠재적 인 이식성 문제에 대해 알고 있습니다. 하지만 가독성이 높아지고 있습니다. 선언에서이 유형을 검색하기 위해 위아래로 이동할 필요가 없습니다 (다른 스레드에서 논의 할 수 있음).


업데이트 : 조금 더 정보를, 나는라는 파일 main.c.에 위의 코드를 넣어 사용 플랫폼은 우분투 8.04이며, 편집기, 으로 GVIM 내가 그것을 실행할 때이 부목의 출력입니다 :

splint +gnuextensions main.c 
Splint 3.1.1 --- 03 Nov 2006 

Command Line: Setting +gnuextensions redundant with current value 
main.c:8:8: Parse Error. (For help on parse errors, see splint -help 
       parseerrors.) 

을 그리고 이것은 내가 전에 생각하지 않았다 2 개 더 많은 질문을 엽니 다.

  1. "현재 값으로 중복", 현재 값은 무엇입니까?

  2. 왜 구문 분석 오류가 아니며 경고가 아닙니다.


업데이트 :이 문제를 지원하는 패치 부목에있는 posibility가있다 이 내가이 시도하지 않은 아직하지만 난 그게 해결책이라고 생각합니다.뭔가 억제 할 수있는 경우

+1

여기에있는 동안 for 문 안에 int를 선언해야합니다. – starblue

+0

성가신 경고 또는 파서 오류가 발생합니까? –

+0

그리고 splint를 부수는 "int"와 "i"사이의 공간입니까? – Johan

답변

7

여기 패치입니다 : http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

당신은 부목/src 디렉토리에 있다면 패치 -p2을 통해 그에게 먹이를 할 수 있어야하고 그냥 다시 작성해야합니다. 이 이메일에서의

: (. 그의 간격에 대한 죄송합니다) http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

당신이 연결된 스레드 starblue을 따르는 경우

당신은 결국 그것을 찾을 수 있습니다,하지만 난 뛰어 줄 알았는데 너를 위해 끝까지.

부목사는 현재 관리자가없는 것 같습니다. 불행히도. 내가 바쁜 사람이 아니라면 더 올라가고 있고 더 많이하는 것을 고려할 것이다.

제이크

+0

방금 ​​패치를 부목 3.1.2 소스에 적용 해 보았습니다. 내가 그것을 만들려고 할 때 구문 오류가 발생했습니다. splint 3.1.2 *를 설치하지 않고 구문 오류가 발생했습니다. –

2

보통, 부목과 함께, 그것은

당신은 (대부분)에 회전 부목 + gnuextensions의 foo.c를을 시도 할 수 있습니다 GNU/GCC "+ thisflag 또는 -thisflag 이것을 억제"말할 것이다 splint가 다른 방법으로 문제를 일으킬 것입니다.

저는 부목을 valgrind를 사용하는만큼 자주 사용합니다.

편집 :

다른 사람이 말했듯이, 파서 (안 분석기)로 실행중인, 플래그 정말이 경우에 도움이 될 것되지 않도록.

+0

- "커맨드 라인 : 현재 값으로 중복되는 + gnuextensions 설정", 차단이 있습니다. – Johan

3

나는 부목에 익숙하지 해요,하지만 their FAQ에서 :

부목은 컴파일러에서 독립적이다. 표준 C 코드 인 을 ISO C99 사양에 따라 검사합니다. Splint는 대부분 을 지원하지만 C99 확장자는 ANSI C입니다. Splint는 ( + gnuextensions를 사용하는 경우)의 일부를 지원합니다.

선언문의 위치는 C99에서 완벽하게 준수하므로 아마도 이것이 부목의 버그라고 생각할 수 있습니다. 또는 부목에 아직 지원되지 않는 "확장 기능"중 하나입니다. 어느 쪽이든 그들은 귀하의 의견에 관심이있을 수 있습니다. 변수 선언에 대해 C99 호환 lint 도구가 불평 할 이유가 없어야합니다.

5

This thread (부목) 메일 링리스트에서 문제를 논의합니다.

파서가 대부분 C89/C90 인 것 같습니다. 라이브러리 만 C99 인 것 같습니다.

문제는 파서가 있기 때문에 플래그를 설정하여 문제를 해결할 수 없습니다.

+1

나는 당신이 정확하다고 생각하지만, 나는 그 목록에 메일을 보내어 알아 낸다. http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html 어떤 ​​일이 일어나는지 보겠습니다. – Johan

관련 문제