Как я могу заставить шину игнорировать, где я объявляю свои переменные? - PullRequest
6 голосов
/ 21 марта 2009

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

Я знаю, что старая школа c говорит вам объявлять переменные прямо в начиная с каждой функции, но так как я плохой человек, мне нравится объявлять вещи, близкие к тому, где я их использую. Хороший пример - поставить int 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.

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

Спасибо Johan


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

Предупреждения 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.)

И это открывает еще 2 вопроса, о которых я раньше не думал.

  1. "избыточно с текущим значением", какое текущее значение?

  2. Почему это ошибка разбора, а не предупреждение?


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

Ответы [ 4 ]

7 голосов
/ 23 марта 2009

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

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

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

(Извините за промежуток на этом.)

В конце концов, вы обнаружите, что если вы последуете за нитью, с которой связан синий, но я подумал, что прыгну до конца для вас.

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

Джейк

5 голосов
/ 21 марта 2009

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

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

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

3 голосов
/ 21 марта 2009

Я не знаком со сплинтом, но из их FAQ :

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

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

2 голосов
/ 21 марта 2009

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

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

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

Edit:

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

...