LINUX.ORG.RU

Я снова пришел поблевать на единорога

 ,


1

4
#include <zlib.h>
...
    if (method == FEN_COMPRESS_TYPE_GZIP)
        idata->ret = inflateInit2(&idata->strm, FEN_ENABLE_GZIP);
# pvs-studio report:
./projects/shared/libfenrir/code/utils/fen_gzip.c:140:1: warn	V1031 The 'inflateInit2' function is not declared. Passing data to or from this function can be affected.
./projects/shared/libfenrir/code/utils/fen_gzip.c:142:1: warn	V1031 The 'inflateInit2' function is not declared. Passing data to or from this function can be affected.

zlib.h:

#  define inflateInit2(strm, windowBits) \
          inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
                        (int)sizeof(z_stream))

Ну то есть понятно, да? Оно даже не пытается разворачивать макросы/препроцессить. Тупо видит xxx() - считает это функций.

600 000-∞р/год (в зависимости от того насколько вы большая компания) за херобору которая даже gcc -E не делает чтобы получить список актуальных функций.

Я понимаю, что когда делаешь сложный технический продукт можно чего-то не учесть, типа какие-нибудь auto shared_ptr с лямбдами и блекджеком. Но получение списка функций - это базовый функционал, епт!

P.S. косвенную проверку указателя на NULL также все еще не научились. «Либо == NULL либо её у вас нет.»

Кто там из клоунов незабаненный остался? @PVS-Studio_engineer, @Andrey_Karpov_2009, @AndreyKarpovN, @Andrey_Karpov_2020

Перемещено anonymous_incognito из talks

★★★★★
Ответ на: комментарий от i-rinat

Я в первом сообщении показал объявление этого макроса. Плюс компиляция проходит успешно.

PPP328 ★★★★★
() автор топика

Кстати, после того как PVS-Studio дали лицензию на свою тулзу Годболту любой может проверять и там.

И у меня не ругается на inflateInit2:

Вот тест, на всякий бред ругается, на inflateInit2 PVS-Studio пофигу:

https://gcc.godbolt.org/z/sx8ocx

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от PPP328

Я в первом сообщении показал объявление этого макроса.


#define LOL_NO

// ...
// ...
// ...

#ifndef LOL_NO

// ...
// ...
// ...


#  define inflateInit2(strm, windowBits) \
          inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
                        (int)sizeof(z_stream))

// ...
// ...
// ...

#endif

Плюс компиляция проходит успешно.

В Си вызов необъявленной функции это не ошибка. Так что «успешность» ничего не доказывает.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Попробуй добавить первой строчкой #define Z_PREFIX_SET.

Да, появляется:

warning: V1031 The ‘inflateInit2’ function is not declared. Passing data to or from this function can be affected.

https://gcc.godbolt.org/z/bEnbvY

fsb4000 ★★★★★
()

Анализатор PVS-Studio работает только с уже препроцессированными файлами. Таким образом, если анализатор говорит, что функция не объявлена, значит она не объявлена.

Что-бы лучше понять, что происходит, предлагаю сгенерировать препроцессированный *.i файл и посмотреть его содержимое. С вероятность 99% процентов там действительно не будет объявления функции inflateInit2. Почему так происходит, сказать сложно и нужно разбираться с ключами компиляции, директивами компиляции и так далее.

Если сработает 1%: функция есть, но анализатор выдаёт предупреждение, то это какая-то ошибка и я прошу прислать в поддержку этот злополучный препроцессированный файл.

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

Примечание. Хочу отметить, что если C файл компилируется, это не значит что функция объявлена. В этом и суть предупреждения. Прошу ознакомиться с описанием диагностики: https://www.viva64.com/ru/w/v1031/ Как раз весь смысл выявить вот такие нехорошие ситуации. Кажется, что всё хорошо, а на самом деле беда. За это наш анализатор и любят. Но не у всех хватает терпения/желания/квалификации его понять и оценить :). Такова жизнь.

Andrey_Karpov_2020
()
Ответ на: комментарий от pon4ik

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

Раз инструмент много лет успешно на рынке, то, наверное, не всё так плохо? :) Быть может пришло время попробовать? Зачем так бурно реагировать на тему, созданную человеком, у которого что-то не получилось или он что-то не понял? :)

Andrey_Karpov_2020
()
Ответ на: комментарий от Andrey_Karpov_2020

А вот и ты!

Пришел говна поесть?

anonymous
()
Ответ на: комментарий от anonymous

а как оно вообще умудряется что-то проверять смотря в однин файл не видя весь код целиком?

Никак. Анализатор проверяет только те файлы, которые он в состоянии препроцессировать.

Andrey_Karpov_2020
()
Ответ на: комментарий от bhfq

хрень этот ваш pvs, упор делается на ошибки копипасты и всякую муть которую нормальный человек и не пишет

А откуда тогда все эти ошибки? :) https://www.viva64.com/ru/examples/

Быть может лабораторные работы? Нет. Это Chromium, LibreOffice, Linux Kernel и так далее. :)

Andrey_Karpov_2020
()
Ответ на: комментарий от PPP328

Плюс компиляция проходит успешно.

Ещё раз: компиляция ничего не значит. В этом и смысл предупреждения. Если не понятно описание предупреждения, то вот есть ещё такая заметка: Красивая 64-битная ошибка на языке Си - https://www.viva64.com/ru/b/0033/

Andrey_Karpov_2020
()
Ответ на: комментарий от bhfq

если проект опенсорц то есть coverity scan. но да никто тебе не запретит поднять виртуалку без интернета и проверять в нем хоть коммерческий проект тупо добавляя эти строчки кода скриптом.

У нас всё проще: Бесплатная лицензия на PVS-Studio для Open Source - https://www.viva64.com/ru/open-source-license/

Andrey_Karpov_2020
()
Ответ на: комментарий от Andrey_Karpov_2020

Анализатор PVS-Studio работает только с уже препроцессированными файлами. Таким образом, если анализатор говорит, что функция не объявлена, значит она не объявлена.

Ну вот, шоу о том, как топикстартер блюёт на единорога, не состоялось.

Расходимся.

wandrien ★★
()
Ответ на: комментарий от Andrey_Karpov_2020

Ммм, вот и пошёл поток спама. Я вроде не припомню бурной реакции. В хедпосте изложена конкретная проблема, которую те инструменты которыми я пользовался не имели ещё n лет назад.

Я вполне допускаю, что продукт хороший, годный, но агрессивный маркетинг особенно на моём лорчике не способствует даже зарождению мыслей о приобретении, ни в организацию ни в личное пользование. Ибо зачастую, чем лучше реклама тем хуже сабж.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Править комментарий не могу. Сорри. Уточню. Я мел в виду, что есть inflateInit2_ с 4 аргументами. Но это вовсе не она используется при вызовы inflateInit2(a, b). Объявления inflateInit2 нет.

Andrey_Karpov_2020
()
Ответ на: комментарий от i-rinat

А почему это вообще допускается? Каковы причины того, что можно вызвать необъявленную функцию?

anonymous
()

Мои комментарий с основным пояснением удалили. Хорошо, попробую, другими словами.

Есть баг в коде, который выдаётся за баг в анализаторе :). Добавляем генерацию препроцессированного файла: https://gcc.godbolt.org/z/9eo8hj

Изучаем препроцессированный файл и видим. Существует объявление функции: extern int inflateInit2_ (z_streamp strm, int windowBits, const char *version, int stream_size)

Но вызывается вовсе не она, а функция inflateInit2: return inflateInit2(a, b);

Но в препроцессированном файле нет объявления никакой inflateInit2. Анализтор абсолютно прав, выдавая предупреждение. Т.к. первый аргумент указатель, то мы уже как минимум имеем ошибку в 64-битном коде и возможно даже потенциальную уязвимость.

Если же удалить #define Z_PREFIX_SET то и нет никакого предупреждения: https://gcc.godbolt.org/z/sx8ocx

Andrey_Karpov_2020
()
Ответ на: комментарий от anonymous

В случае gcc и clang достаточно указать опцию -Werror=implicit-function-declaration.

Не знаю, исправлено ли в свежих стандартах, т.к. большая часть кода у меня собирается в режиме c99.

Да что там говорить, большая часть крупных проектов на Си до сих пор тащит совместимость с ANSI C. В частности, не дает обьявлять переменные в произвольном месте блока.

Я еще лет десять назад задавался вопросом, что это за железо и платформы, где это нужно.

wandrien ★★
()
Ответ на: комментарий от Andrey_Karpov_2020

Давай, мы проверим и, если окажется, что ты не прав, то ты поешь говна в прямом эфире?

anonymous
()
Ответ на: комментарий от anonymous

Да это ещё в C99 вроде как убрали, только GCC и Clang всё ещё выдают предупреждение, а не ошибку. Даже если явно указывать стандарт через -std=.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.