문제

내 변수를 선언하는 위치를 무시할 수있는 방법을 알고 있습니까?

나는 구식 C가 모든 기능의 시작 부분에 바로 변수를 선언하라고 말하지만, 나는 나쁜 사람이기 때문에 내가 사용하는 곳에 가까운 곳을 선언하는 것을 좋아합니다. 좋은 예는 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 i를 움직이고 싶습니다. 한 줄을 위로 올리거나 {}를 선언과 for 루프를 두십시오.

그리고 이제 질문 에이 수표를 끄는 방법은 무엇입니까? 그러나 좋은 다른 점검을 유지합니까?

감사합니다. Johan


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

내가 사용하는 gcc 경고 : -wall -w -wextra -wconversion -wshadow -wcast -qual -wwrite -strings -werror

참고 2 : 나는 그 나쁜 행동에서 비롯된 잠재적 이식성 문제에 대해 알고 있습니다. 그러나이 유형의 선언을 찾기 위해 위아래로 점프 할 필요가없는 가독성이 높아지는 것이 더 가치가 있다고 생각합니다 (그리고 이것은 다른 스레드에서 논의 할 수 있습니다).


업데이트: 조금 더 많은 정보를 얻으면서 위의 코드를 main.c.라는 파일에 넣었습니다. 사용 된 플랫폼은 Ubuntu 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.)

그리고 이것은 내가 전에 생각하지 않은 두 가지 질문을 더 열어줍니다.

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

  2. 왜 구문 분석 오류가되고 경고가 아닌가?


업데이트::이 문제를 뒷받침하기 위해 스플린트를 패치 할 가능성이 있습니다. 나는 이것을 시도하지는 않았지만 아직 해결책이라고 생각합니다.

도움이 되었습니까?

해결책

패치는 다음과 같습니다.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

(그것에 대한 간격에 대해 죄송합니다.)

당신이 결국 당신이 링크 된 Thread StarBlue를 따라 가면, 나는 당신을 위해 끝까지 점프 할 것이라고 생각했습니다.

불행히도 부목은 지금 관리자가없는 것 같습니다. 내가 그렇게 바쁘지 않으면 더욱 바쁘지 않으면 더 많은 일을하는 것을 고려할 것입니다.

제이크

다른 팁

이 스레드 스플린트 메일 링리스트 에서이 문제에 대해 설명합니다.

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

문제는 파서와 관련이 있으므로 플래그를 설정하여 사라질 수 없습니다.

나는 부목에 익숙하지 않지만 그들의 FAQ:

부목은 컴파일러와 독립적입니다. ISO C99 사양에 따라 표준 C 코드를 확인합니다. Splint는 ANSI C에 대한 C99 확장의 대부분을 지원하지만 대부분은 아닙니다. Splint는 일부 GCC 컴파일러 확장을 지원합니다 (IF +Gnuextensions가 사용됨).

선언의 위치는 C99에 따라 완벽하게 준수 되므로이 버그를 부목으로 간주 할 수 있습니다. 또는 그것은 Splint가 아직 뒷받침되지 않은 "확장"중 하나입니다. 어느 쪽이든 그들은 당신의 피드백에 관심이있을 수 있습니다. C99 호환 보풀 도구가 변수 선언에 대해 불평 할 이유가 없어야합니다.

일반적으로 부목을 사용하면 무언가를 억제 할 수 있다면 " +thisflag 또는 -thisflag로 이것을 억제합니다"라고 말할 것입니다.

Splint +Gnuextensions foo.c를 시도 할 수 있습니다.

나는 Valgrind를 사용하는만큼 부목을 거의 자주 사용합니다.

편집하다:

다른 사람들이 말했듯이, 당신은 파서 (분석기가 아님)에 들어가기 때문에이 경우 깃발이 실제로 도움이되지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top