LINUX.ORG.RU
ФорумTalks

Попробовали мы тут в демо режиме натравить на нас пивас

 


0

2
i32 xxxx(const void * p1, const void * p2)
{
    const u8   * p1_u8 = p1;
    const u8   * p2_u8 = p2;

    if (p1_u8 == p2_u8)
        return 0;
    if (p1_u8 == NULL)
        return *p2_u8;  // 403
    if (p2_u8 == NULL)  // 404
        return *p1_u8;
V595 The 'p2_u8' pointer was utilized before it was verified against nullptr. Check lines: 403, 404.

Короче эта хреновина не в состоянии элементарно попеременно подставить NULL/val во входных данных как это делает cppcheck/clang-tidy.

Такие дела.

★★★★★

Инструмент для поиска опечаток, не более.

a1batross ★★★★★
()

А можно вместо лысого из PVS призвать лысого из Brazzers? Последний хотя бы харизмой обладает.

hateyoufeel ★★★★★
()

Справедливости ради надо сказать, что код написан в стиле «смотрите, как я могу». При чтении о такое спотыкаешься.

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

А может это ВЫ ничего не поняли? В коде ошибки нет. п2 проверен на NULL несколькими строчками выше.

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

Но в строке 403 p2_u8 уже проверен на NULL, хоть и чрезжопно. Что именно ТС не понял? По-моему, PVS просто не строит связей между переменными по ходу выполнения кода.

hateyoufeel ★★★★★
()

Вы взяли инструмент определения говнокода и он указал вам на говнокод. Какие претензии вообще?

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

Говнокод — это не то, что не работает, а то, что выглядит как говно. Эти проверки можно написать так, чтобы оно было и понятно с первого взгляда и работало правильно.

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

Ну вот, допустим, я хочу обучиться работе с их «инструментом». Мне для этого, что, нужно юрлицо открывать теперь ?

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

Я могу понять, почему этот код будет работать, но на это уходит слишком много времени. Поэтому я считаю, что этот код — плохой.

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

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

У ограничений анализатора PVS-Studio в trial режиме имеется две цели. Первая - как можно быстрее показать потенциальному пользователю, что статический анализатор может находить ошибки в его коде. Вторая - побудить к общению с нами в почте, чтобы помочь использовать инструмент правильно.

Где они скажут, что с физлицами дел не имеют.

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

Обоснование ограничения на количество переходов к ошибкам и анкеты на запрос персональных данных - вообще смех.

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

Последнего вменяемого специалиста забанили, одни студенты-мизантропы, электромеханики с дворниками да нищие шизики остались.

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

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

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

Вы взяли инструмент определения говнокода и он указал вам на говнокод. Какие претензии вообще?

Неочевидный стиль программирования != ошибке в коде, ядрен батон. PVS это статический анализатор или indent с перделками?

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

Сначала спросил, а потом обосрал или наоборот?

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

а помоему это ты не в состоянии элементарно понять написанное.

++

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

Неочевидный стиль программирования != ошибке в коде, ядрен батон

говнокод != ошибке в коде.

Странно что такие вещи всё еще остаются непонятными.

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

Мы тут про верификацию кода или про что? Условие выполнено, NULL'ом быть не может. Если статический анализатор этого не понимает, то анализатор слегка коряв.

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

для очень горячего кода

Это замена memcmp. На Minix пашет быстрее «обычной», на линуксе чуть медленнее, но имеет доп проверки на NULL.

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

Зачем их добавлять, если они уже есть? Вы предлагаете вставить

if ((p1_u8 == NULL) || (p2_u8 == NULL))
    return 0;
В начале? В среднем по тестам это замедляет на 5%, не добавляя функционала.

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

как тут уже много раз отписали, анализатор вполне корректно указал на потенциальную граблю с nullptr.

if (p1_u8 == NULL)
        return *p2_u8;  // 403

в коде выше, от момента входа в функцию нет ни единой проверки p2_u8 на значение NULL при этом вы пытаетесь разыменовать указатель.

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

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

в коде выше, от момента входа в функцию нет ни единой проверки p2_u8 на значение NULL при этом вы пытаетесь разыменовать указатель.

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

Видимо они НЕ имеют бОльшую квалификацию, ибо проверка на NULL там есть.

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

но имеет доп проверки на NULL.

Зачем? В стандарте не написано, что она может принимать NULL, поэтому корректные программы не должны туда передавать NULL. Поэтому корректные программы обязаны проверять на NULL перед вызовом memcmp, что делает проверку внутри memcmp лишней. Ты тратишь лишнее время на эти проверки.

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

Нет. Суть в том, что можно написать 100 проверок в вызывающем коде и постоянно вхреначивать тонны проверочного кода ИЛИ добавить ОДНУ проверку в самой функции.

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

Опытным путем выяснили, что в основном копируются блоки со средней длиной в 128 байт.

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

Опытным путем выяснили, что в основном копируются блоки со средней длиной в 128 байт.

И ты хочешь сказать, что в этом случае лишняя проверка стоит 5%? Думаю, вы что-то не так меряете.

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

И чем это отличается от того, чтобы функционал обертки уже присутствовал в исходной функции?

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

Неа, всё равно плохо. У тебя ведь и другие функции с таким же префиксом? И обозначает это префикс что-то типа названия библиотеки? Тогда при чтении кода этот префикс по сути выкидывается, и от функции будут ждать такого же поведения, что и от memcpy. (Кстати, раньше ты вроде не про memcpy писал, а про memcmp).

Ты не думаешь о сокрытии сложности. Сейчас ты пока помнишь особенности своей функции. Пройдёт год — забудешь. Потом наберётся ещё кучка функций, часть из которых проверяет параметры, часть — нет. Будешь сидеть гадать, а вот нормально тут в новом коде они использованы или нет.

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted
    if (p1_u8 == p2_u8)
    +
    if (p1_u8 == NULL)

Это очевидно всем в треде, кроме вас. А еще пятизвездочник.

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

часть из которых проверяет параметры, часть — нет

Эта либа у нас активно юзается не одним разработчиком, поэтому проверки есть во всех функциях.

(Кстати, раньше ты вроде не про memcpy писал, а про memcmp).

Опечатка.

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.