Rahul VB Ответов: 2

Функция Putchar выдает предупреждение о статическом анализе кода


Всем Привет,

Я столкнулся с ошибкой, как показано ниже:

    else if (r_bytes == -1)
   {
It looks like the following line is intended to be executed as (*(*__stdout())->_p)++, but C++ operator precedence rules mean it will be executed as *((*__stdout())->_p++). Either this, or the * is unnecessary.
CID 11299 (#2 of 2): Incorrect pointer increment (NO_EFFECT)no_effect_deref: The dereference in (int)*(*__stdout())->_p++ has no effect.
no_effect_deref: The dereference in *(*__stdout())->_p++ has no effect.
            putchar('+');
            return false;
    }


При запуске статической проверки кода я обнаружил, что предупреждение, которое дал инструмент, было "
Цитата:
Неправильное приращение указателя (NO_EFFECT)no_effect_deref: разыменование в (int)*(*__stdout())->_p++ не имеет никакого эффекта
"

Я не понимаю, что он хотел сказать. Увеличивает ли putchar буфер stdout?

Любая помощь будет оценена по достоинству

Что я уже пробовал:

Изучить работу putchar, но не мог найти его связь с стандартный вывод

2 Ответов

Рейтинг:
1

k5054

putchar(int) эквивалентно putc(int, stdout). Более того, putc(int, FILE *) эквивалентно fputc(int, FILE *), но может быть реализован как макрос.

В этом случае может показаться, что putchar и putc реализованы как макросы. Как это часто бывает, разработчики стандарта C lib использовали свои знания о внутренних компонентах a FILE * объект для реализации putc, и у них обычно есть веские причины делать что-то со стандартными объектами lib (например, файл*), чего программист обычно избегает. Это означает, что инструменты анализа могут сообщать о проблемах с расширенным макросом, но обычно их можно игнорировать. Если проблема исчезнет, если вы замените ее putchar('+') с fputc('+', stdout), то это один из тех случаев, когда вы можете спокойно игнорировать предупреждение от инструмента анализа.


Rahul VB

Здравствуйте Сэр,

Спасибо за решение. Значит ли это, что использование fputc не приведет к увеличению stdout?

Спасибо,
Рахул

Рейтинг:
0

Richard MacCutchan

Цитата:
Увеличивает ли putchar буфер stdout?
Да, как и любая из стандартных функций, выводящих текст. Однако, поскольку это часть библиотеки времени выполнения C, вам не о чем беспокоиться.

[редактировать]
Если вы беспокоитесь, то легко смоделировать оскорбительный код.
[/редактировать]


Rahul VB

Здравствуйте Сэр,

Я бы попросил вас сообщить мне, какой код или возможное исправление можно использовать, чтобы оправдать то, что ошибка может быть проигнорирована.Потому что нам также нужно написать модульный тест, чтобы доказать правильность нашего анализа.

После ссылки на несколько сайтов я вижу , что использование любой функции, такой как putc и запись в stdout, должно решить эту проблему.

Правильно ли я понимаю? Потому что каким-то образом, если я смогу доказать, что буфер stdout увеличивается с помощью putchar, то я смогу обеспечить исправление.

Спасибо,
Рахул

Richard MacCutchan

Там нет ошибки, так что ничего не нужно исправлять.