Как я могу заставить splint игнорировать то, где я объявляю свои переменные?

StackOverflow https://stackoverflow.com/questions/669023

Вопрос

Вы знаете, как я могу заставить splint игнорировать то, где я объявляю свои переменные?

Я знаю, что старая школа 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;
}

Здесь splint и большинство старых компиляторов c хотели бы переместить int i;вверх на одну строку, или поместить {} вокруг объявления и цикла for.

А теперь к вопросу, как мне отключить эту проверку?Но сохраните остальные чеки, это хорошо?

Спасибо Йохан


Примечание 1:Я уже использую предупреждения gcc (см. Ниже) в качестве первой линии защиты, а valgrind - во вторую.Но я подумываю о добавлении splint в мой список вещей, которые могли бы контролировать мою глупость ;-) Но эта проверка просто раздражает,

Предупреждения gcc, которые я использую:-Стена -W -Wextra -Wconversion -Wshadow -Wcast-качественный -Wwrite-строки -Ошибка

Примечание 2:Я знаю о потенциальных проблемах с переносимостью, которые могут возникнуть из-за такого плохого поведения.Но я чувствую, что это повышает удобочитаемость, то есть отсутствие необходимости прыгать вверх и вниз для поиска этого типа в объявлениях является более ценным (и это мы можем обсудить в другой теме).


Обновить:Чтобы получить немного больше информации, я поместил приведенный выше код в файл под названием main.c.Используемая платформа - Ubuntu 8.04 и gvim в качестве редактора, и это результат работы splint, когда я его запускаю:

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. Почему это ошибка синтаксического анализа, а не предупреждение?


Обновить::Существует возможность исправления шины для решения этой проблемы, Я еще не пробовал это, но я думаю, что это решение.

Это было полезно?

Решение

Вот заплатка:http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

Вы должны иметь возможность передать это через patch -p2, если вы находитесь в каталоге splint / src, а затем он должен просто перестроиться.

Это из этого письма:http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

(Извините за такой пробел в этом вопросе.)

В конце концов вы поймете это, если проследите за нитью, на которую ссылается starblue, но я решил перейти к концу за вас.

К сожалению, Spint, похоже, сейчас без сопровождающего.Я бы подумал о том, чтобы сделать еще кое-что, если бы не был так занят.

Джейк

Другие советы

Этот поток в списке рассылки Splint обсуждается эта проблема.

Похоже, что синтаксический анализатор в основном C89 / C90, только библиотека, похоже, C99.

Поскольку проблема связана с синтаксическим анализатором, вы не можете устранить ее, установив флаги.

Я не знаком с лубком, но из их ЧАСТО задаваемые вопросы:

Splint не зависит от вашего компилятора .Он проверяет стандартный код C, в соответствии со спецификацией ISO C99 .Splint поддерживает большинство, но не все расширения C99 к ANSI C.Splint поддерживает некоторые из расширений компилятора gcc (если используется +gnuextensions).

Позиция вашего объявления полностью соответствует стандарту C99, поэтому, возможно, вы могли бы считать это ошибкой в splint.Или это одно из "расширений", еще не поддерживаемых splint.В любом случае, они могут быть заинтересованы в вашем отзыве.У инструмента lint, совместимого с C99, не должно быть причин жаловаться на объявления переменных.

Обычно, с помощью spint, если что-то может быть подавлено, будет сказано "подавите это с помощью +thisflag или -thisflag".

Вы могли бы попробовать spint + gnuextensions foo.c , который включает (большинство) расширений GNU / GCC, с которыми в противном случае у spint возникли бы проблемы.

Я использую шину почти так же часто, как valgrind.

Редактировать:

Как уже говорили другие, вы сталкиваетесь с синтаксическим анализатором (а не с анализатором), поэтому флаги действительно не помогут в этом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top