Splint: локальная переменная, используемая перед определением

Я знаю, что локальные переменные могут иметь «случайное» значение, если они не установлены, но плохо ли устанавливать первое значение локальной переменной с помощью указателя? Например:

void setValue(int* p_val)
{
    *p_val = …; /* Assignment does not use *p_val */
}

int main(void)
{
    int val;
    setValue(&val);
    printf("%d", val);
    return 0;
}

Где setValue только устанавливает и никогда не считывает значение указанной переменной. Splint предупреждает меня, что val «используется перед определением», и я немного удивлен этим предупреждением, поскольку я считаю, что значение val должно быть установлено до того, как будет выполнено printf и использовано val. Является ли шина недостаточно развитой, чтобы распознать эталон, используемый для установки начального значения?


person Octribin    schedule 01.12.2017    source источник
comment
Это потенциально хороший вопрос, но для полноты картины, не могли бы вы вставить setValue?   -  person Bathsheba    schedule 01.12.2017
comment
@Bathsheba опередила меня на 9 секунд. :)   -  person Sourav Ghosh    schedule 01.12.2017


Ответы (1)


Если setValue(&val); действительно присваивает val чему-либо посредством указателя, то поведение вашего кода определено, а инструмент анализа неверен.

Но если можно избежать наличия переменных в неинициализированных состояниях (без лишних присваиваний), то это было бы предпочтительнее. Можно ли провести рефакторинг

int val = setValue();

сказать?

person Bathsheba    schedule 01.12.2017
comment
Конечно, в этой ситуации;) Однако я разобрал проблему до сути, и мой дизайн (установка нескольких переменных одновременно) несовместим с вашим предложением. - person Octribin; 01.12.2017