Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 02.05.23 22:44
Оценка: -5 :))
Вроде же не сложно такое отследить:

#include <iostream>

class C1
{
public:
    const char* V1;
};

C1* fun2()
{
    char t[2];
    t[0] = 't';
    t[1] = 0;

    C1* c = new C1();
    c->V1 = t;

    return c;
}

int main()
{
    C1* t = fun2();
    std::cout << t->V1 << "\n";
}


Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?

З.Ы.

Вынужден пояснить.

Проблема здесь не сколько в забытом delete t а в присвоении стековой памяти c->V1 = t и использовании ее за пределами стека.
Отредактировано 03.05.2023 14:33 Shmj . Предыдущая версия . Еще …
Отредактировано 02.05.2023 22:56 Shmj . Предыдущая версия .
Отредактировано 02.05.2023 22:46 Shmj . Предыдущая версия .
Re: Почему CLion и VS не предупреждают?
От: DiPaolo Россия  
Дата: 03.05.23 01:51
Оценка:
S>Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?

Qt Creator сразу дает предупреждение:

Potential leak of memory pointed to by 't' [clang-analyzer-cplusplus.NewDeleteLeaks]


Скорее всего, в CLion и VS можно как-то настроить. Как минимум, можно прикрутить стороннюю тулзу через настройки. Например, при сохранении файла прогонять статик аналайзером.

Что использовать:
— PVS
— cppcheck
— аналайзер clang

есть и другие

PS судя по документации, в вижуальнике это работает из коробки — https://learn.microsoft.com/en-us/cpp/code-quality/walkthrough-analyzing-c-cpp-code-for-defects?view=msvc-170. Может ты имел ввиду VS Code, и там этого нету
Патриот здравого смысла
Re: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 06:46
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Вроде же не сложно такое отследить:


S>
S>#include <iostream>

S>class C1
S>{
S>public:
S>    const char* V1;
S>};

S>C1* fun2()
S>{
S>    char t[2];
S>    t[0] = 't';
S>    t[1] = 0;

S>    C1* c = new C1();
    c->>V1 = t;

S>    return c;
S>}

S>int main()
S>{
S>    C1* t = fun2();
S>    std::cout << t->V1 << "\n";
S>}
S>


S>Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?


Плагин называется "увольнение по статье без выходного пособия".
--
Re: Почему CLion и VS не предупреждают?
От: B0FEE664  
Дата: 03.05.23 08:02
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?


Нативные массивы не должны использоваться.
Голые/сырые указатели не должны использоваться.
Тогда подобные вещи искать придётся крайне редко.
И каждый день — без права на ошибку...
Отредактировано 03.05.2023 15:58 B0FEE664 . Предыдущая версия .
Re[2]: Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 03.05.23 08:18
Оценка: :))) :)
Здравствуйте, rg45, Вы писали:

R>Плагин называется "увольнение по статье без выходного пособия".


Это было во времена вашей молодости. Сейчас не проблема уволить и найти чела под приятные языки — а где вы будете искать того, кто согласится на C++?
Re[3]: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 08:24
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Это было во времена вашей молодости. Сейчас не проблема уволить и найти чела под приятные языки — а где вы будете искать того, кто согласится на C++?


Изредка находятся, все-таки, прикинь! И, как правило, это такие люди, которым приятно работать именно на C++ со всей его сложностью и недостатками. А ты, как обычно, пытаешься натянуть свой больной прыщик на всю вселенную.

P.S. И, как бы то ни было, лучше вообще никого не нанимать, чем взять на работу профнепригодное убожество. От такого вот
Автор: Shmj
Дата: 03.05.23
точно не станет лучше никому.
--
Отредактировано 03.05.2023 8:37 rg45 . Предыдущая версия . Еще …
Отредактировано 03.05.2023 8:28 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 8:28 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 8:26 rg45 . Предыдущая версия .
Re[3]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 03.05.23 08:29
Оценка:
Здравствуйте, Shmj, Вы писали:

S>а где вы будете искать того, кто согласится на C++?


А что, кто-то ищет?
Re[3]: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 08:45
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это было во времена вашей молодости. Сейчас не проблема уволить и найти чела под приятные языки — а где вы будете искать того, кто согласится на C++?


Сущности "приятно" и "неприятно" относятся к категории субъективных ощущений и напрямую завязаны на твои навыки в той или иной области. Если ты не умеешь плавать и ездить на велосипеде, то приятными эти занятия тебе, конечно же, не будут казаться. Но абсолютизирование своих личных фобий на весь мир — это просто признак небольшого ума.
--
Отредактировано 03.05.2023 8:50 rg45 . Предыдущая версия . Еще …
Отредактировано 03.05.2023 8:45 rg45 . Предыдущая версия .
Re[3]: Почему CLion и VS не предупреждают?
От: reversecode google
Дата: 03.05.23 08:51
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это было во времена вашей молодости. Сейчас не проблема уволить и найти чела под приятные языки — а где вы будете искать того, кто согласится на C++?


а что в С# настолько все плохо и нет работы, что шарписты набежали в тему С++ ?
Re[3]: Почему CLion и VS не предупреждают?
От: serg_joker Украина  
Дата: 03.05.23 08:54
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Это было во времена вашей молодости. Сейчас не проблема уволить и найти чела под приятные языки — а где вы будете искать того, кто согласится на C++?


Не ты выбираешь С++, С++ выбирает тебя.

Сэкономь себе время, а коллегам нервы. Иди сразу на "приятные языки".
Re[4]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 03.05.23 09:07
Оценка:
Здравствуйте, rg45, Вы писали:

R>От такого вот
Автор: Shmj
Дата: 03.05.23
точно не станет лучше никому.


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

Хотя есть маркер, который наводит на мысль, что ТС так может и в продакшен пИсать
Re[5]: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 09:17
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Хотя есть маркер, который наводит на мысль, что ТС так может и в продакшен пИсать


Причем, жирный такой маркер — круг вопросов, которые он поднимает, указывает на то, что он не вникал и не собирается. Я ему дважды уже пытался намекать, что пора бы познакомиться с RAII, но это его лишь раздражает: http://rsdn.org/forum/cpp/8515546.1
Автор: Shmj
Дата: 30.04.23
. Сладостные грёзы о "приятных языках", где можно какать находу, где за тобой все приберут и подотрут, мешают погружению в пучины противного C++.
--
Отредактировано 03.05.2023 9:22 rg45 . Предыдущая версия .
Re[6]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 03.05.23 09:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>Причем, жирный такой маркер — круг вопросов, которые он поднимает


Вопросы-то ладно. Я сам когда в новую тему погружаюсь формулирую такие вопросы, от которых затем самому стыдно становится, когда какое-то понимание достигается.

Я про другое. ТС же вроде уже несколько месяцев как C++ мучает. Я так понимаю, что ему даже за это платят.
Но при этом он даже свой пример не может записать в таком виде, чтобы не возникало вопросов из категории "но что за фигня? можно же проще!"

Я бы от человека, который несколько месяцев изучает более-менее современный C++ ждал бы что-то вроде:
#include <iostream>

struct C1 {
    const char * V1;
};

C1 fun() {
    char t[] = {'t', 0};
    return { t };
}

int main() {
    C1 t = fun();
    std::cout << t.V1 << std::endl;
}

но не вот эту вот простыню из стартового сообщения.

R>Сладостные грёзы о "приятных языках", где можно какать находу, где за тобой все приберут и подотрут, мешают погружению в пучины противного C++.


Может это мое искаженное восприятие реальности, но по моим наблюдениям, если человек начинал учиться программировать на языках с GC и не прошел изначально через Си или C++ (или классический Паскаль, или даже Modula-2 или Ada), то переучивание дается с трудом, и не всем

Это не к тому, что C++ такой сложный, а C++ники какие-то особенные. Просто программирование на языках без GC требует других привычек и лучше бы, чтобы эти привычки формировались в самом начале.
Re[7]: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 12:22
Оценка:
Здравствуйте, so5team, Вы писали:

S>Но при этом он даже свой пример не может записать в таком виде, чтобы не возникало вопросов из категории "но что за фигня? можно же проще!"


Вот именно, использование new там было вообще не в тему — даже в контесте его вопроса. Это лишь линший раз демонстрирует в какую кучу свалены мухи и котлеты в его голове. И сам он эту кучу разгребать не хочет, а тащит ее нам, чтоб мы разбирались в лабиринтах его сложного Квалиа.

S>Может это мое искаженное восприятие реальности, но по моим наблюдениям, если человек начинал учиться программировать на языках с GC и не прошел изначально через Си или C++ (или классический Паскаль, или даже Modula-2 или Ada), то переучивание дается с трудом, и не всем

S>Это не к тому, что C++ такой сложный, а C++ники какие-то особенные. Просто программирование на языках без GC требует других привычек и лучше бы, чтобы эти привычки формировались в самом начале.

Полностью согласен. Я и сам проходил по маршруту C++ -> C#. И знаю многих людей, которые преодолели этот путь без особого труда и в кратчайшие сроки. А вот в обратную сторону... что-то ни одного не припоминаю. Сплошные стоны и сопли.
--
Отредактировано 03.05.2023 12:25 rg45 . Предыдущая версия . Еще …
Отредактировано 03.05.2023 12:24 rg45 . Предыдущая версия .
Re[2]: Почему CLion и VS не предупреждают?
От: T4r4sB Россия  
Дата: 03.05.23 12:40
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Shmj, Вы писали:


S>>Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?


BFE>Нативные массивы не должны использоваться.

BFE>Голые/сырые указатели не должны использоваться.
BFE>Тогда подобные вещи искать не придётся крайне редко.

Ну перепишешь ты этот код на std::array и ссылки. Лучше станет? Нет
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: Почему CLion и VS не предупреждают?
От: T4r4sB Россия  
Дата: 03.05.23 12:46
Оценка: +1
Здравствуйте, so5team, Вы писали:

S> char t[] = {'t', 0};


char t[] = "t";
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 03.05.23 12:54
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>> char t[] = {'t', 0};


TB>char t[] = "t";


Да, спасибо, так еще проще.
Re[2]: Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 03.05.23 13:56
Оценка:
Здравствуйте, DiPaolo, Вы писали:

S>>Ну и сразу вопрос — каким плагином или чем вы находите подобные вещи?


DP>Qt Creator сразу дает предупреждение:

DP>

DP>Potential leak of memory pointed to by 't' [clang-analyzer-cplusplus.NewDeleteLeaks]


А на то что тут c->V1 = t; — присваивается стековая область памяти, которая при выходе из функции как бы считается освобожденной?
Re[7]: Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 03.05.23 13:59
Оценка:
Здравствуйте, so5team, Вы писали:

S>
S>#include <iostream>

S>struct C1 {
S>    const char * V1;
S>};

S>C1 fun() {
S>    char t[] = {'t', 0};
S>    return { t };
S>}

S>int main() {
S>    C1 t = fun();
S>    std::cout << t.V1 << std::endl;
S>}

S>но не вот эту вот простыню из стартового сообщения.

Нужно было уточнить как раз — меня больше интересовал вопрос присваивания стековой памяти, которая освобождается при выходе из фукнции, переменной которая в куче.
Re[3]: Почему CLion и VS не предупреждают?
От: DiPaolo Россия  
Дата: 03.05.23 14:00
Оценка:
S>А на то что тут c->V1 = t; — присваивается стековая область памяти, которая при выходе из функции как бы считается освобожденной?



#include <iostream>

class C1 {
public:
    const char* V1;
};

C1* fun2()
{
    char t[2];
    t[0] = 't';
    t[1] = 0;

    C1* c = new C1(); // <-- выделил память
    c->V1 = t;

    return c; // <-- вернул указатель на выделенную память
}

int main()
{
    C1* t = fun2();
    std::cout << t->V1 << "\n";
} // <-- память из-под t никто не освободил
Патриот здравого смысла
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.