Re[14]: Почему CLion и VS не предупреждают?
От: rg45 СССР  
Дата: 03.05.23 18:27
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Нахрена ты вообще туда new впендюрил, если тебе достаточно вернуть объект по значению?


Потому что программист на си шарп напишет программу на си шарп на любом языке программирования.

P.S. В си шарп нет возможности выбирать способ возврата из функций. Каким образом будет возвращаться тот или иной объект раз и навсегда прошито в типе объекта. Все типы делятся на две категории — ссылочные типы (reference types) и типы-значения (value types). В общем, там много всяких памперсов напридумано. Только очень часто случается, что эти памперсы не могут покрыть всю жопу и тогда появляются разного рода костыли: боксинг, in/out/ref параметры, nullable типы, недо-шаблоны, недо-деструкторы, недо-RAII и прочее уродство. В общем, "язык приятный во всех отношениях".
--
Отредактировано 03.05.2023 18:50 rg45 . Предыдущая версия . Еще …
Отредактировано 03.05.2023 18:49 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 18:47 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 18:40 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 18:39 rg45 . Предыдущая версия .
Отредактировано 03.05.2023 18:37 rg45 . Предыдущая версия .
Re[14]: Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 03.05.23 18:54
Оценка: :)
Здравствуйте, T4r4sB, Вы писали:

S>>Утечку памяти воткнул случайно, т.к. еще не отработал привычку очистки.

TB>Нахрена ты вообще туда new впендюрил, если тебе достаточно вернуть объект по значению?

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

TB>>Нахрена ты вообще туда new впендюрил, если тебе достаточно вернуть объект по значению?


S>Задумка была — проиллюстрировать проблему присвоения стековой памяти и использовать его после удаления ее из стека.


Это как-то отвечает на вопрос: "Нахрена ты вообще туда new впендюрил"?
--
Re[15]: Почему CLion и VS не предупреждают?
От: T4r4sB Россия  
Дата: 03.05.23 19:11
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Задумка была — проиллюстрировать проблему присвоения стековой памяти и использовать его после удаления ее из стека.


Тогда почему ты не удосужился вычистить лишнее из примера? Этот вопрос не относится к знанию того или иного языка. Это общая инженерная культура, блин! Где твоя грёбаная культура нахрен?!
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[6]: Почему CLion и VS не предупреждают?
От: serg_joker Украина  
Дата: 03.05.23 21:05
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Нет в мире совершенства , да и GCC почему-то только с оптимизацией выдаёт предупреждение.


и при замене
С1
на
std::string_view


тоже теряет предупреждения. Прямо скажем, очень ограниченно он диагностирует. Но и на том спасибо.
Re[3]: Почему CLion и VS не предупреждают?
От: AleksandrN Россия  
Дата: 03.05.23 21:37
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну перепишешь ты этот код на std::array и ссылки. Лучше станет? Нет


Если просто переписать 1 в 1, но и использованием array, то станет работать.
#include <iostream>
#include <vector>
#include <array>
#include <memory>

class C1
{
public:
    std::vector<char> V1;
};

std::unique_ptr<C1> fun2()
{
    std::array<char, 2> t = { 't', 0 };

    std::unique_ptr<C1> c = std::make_unique<C1>();
    c->V1.assign(t.begin(), t.end());

    return c;
}

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


Но лучше
#include <iostream>
#include <vector>
#include <array>
#include <memory>

class C1
{
private:
    std::vector<char> V1;
public:
    C1(std::initializer_list<char> list) : V1(list) {};
    void print() const { std::cout << V1.data() << std::endl; }
};

C1 fun2()
{
    // Сработает RVO.
    return C1({ 't', 0 });
}

int main()
{
    auto t = fun2();
    t.print();
}
Re: Почему CLion и VS не предупреждают?
От: PM  
Дата: 03.05.23 21:43
Оценка: 7 (1)
Здравствуйте, Shmj, Вы писали:

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


...

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


Запускаем CI c разными вариантами sanitizers которые встроены в GCC и Clang (например https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-fsanitize_003daddress и ниже). Для отслеживания проблем с памятью помогает Address Sanitizer.

На ваш код без утечки памяти https://godbolt.org/z/M7TK3nocx дает такое при выполнении

Program returned: 1
=================================================================
==1==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f0475700030 at pc 0x7f04782992c1 bp 0x7fffe3dba460 sp 0x7fffe3db9c20
READ of size 2 at 0x7f0475700030 thread T0
#0 0x7f04782992c0 (/opt/compiler-explorer/gcc-13.1.0/lib64/libasan.so.8+0x692c0) (BuildId: c9b24be17e4cbd04bdb4891782c4425e47a9259a)
#1 0x7f047811176c in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (/opt/compiler-explorer/gcc-13.1.0/lib64/libstdc++.so.6+0x14576c) (BuildId: 60915ee46c169683f422e31f8caeb5d5edd58605)
#2 0x4013c4 in main /app/example.cpp:24
#3 0x7f0477c89082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)
#4 0x4010fd in _start (/app/output.s+0x4010fd) (BuildId: 2e4b75a6aaf575ff14172ed6b9ca02728687318e)

Address 0x7f0475700030 is located in stack of thread T0 at offset 48 in frame
#0 0x4011c5 in fun2() /app/example.cpp:10

This frame has 2 object(s):
[48, 50) 't' (line 11) <== Memory access at offset 48 is inside this variable
[64, 72) 'c' (line 15)
...

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

PM>Запускаем CI c разными вариантами sanitizers которые встроены в GCC и Clang


Вот ради этого и стоило создать пост, пусть и подвергнувшись многочисленному высмеиванию. sanitizers, теперь буду знать что это существует.
Re[3]: Почему CLion и VS не предупреждают?
От: reversecode google
Дата: 03.05.23 21:59
Оценка: +1
что такое санитайзер и что он на это может, знает каждый в топике, кроме вас
а с вас смеются потому что вы пиявка
паразитируете на других только бы самому не разбираться
у вас проблемы в само обучением и денег нет даже на ютуб репетитора-учителя ?

но вы не ответили на самый главный вопрос топика
>а что в С# настолько все плохо и нет работы, что шарписты набежали в тему С++ ?
Re[4]: Почему CLion и VS не предупреждают?
От: Shmj Ниоткуда  
Дата: 03.05.23 22:28
Оценка:
Здравствуйте, reversecode, Вы писали:

>>а что в С# настолько все плохо и нет работы, что шарписты набежали в тему С++ ?


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

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

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

Проанализировал все это и понял что от С++ все-равно никуда не уйти.
Re[3]: Почему CLion и VS не предупреждают?
От: PM  
Дата: 04.05.23 05:21
Оценка: 8 (2)
Здравствуйте, Shmj, Вы писали:

PM>>Запускаем CI c разными вариантами sanitizers которые встроены в GCC и Clang


S>Вот ради этого и стоило создать пост, пусть и подвергнувшись многочисленному высмеиванию. sanitizers, теперь буду знать что это существует.


В мире C++ много чего существует, и сеньоры на вашем проекте должны бы по-хорошему про это знать. Если самый опытный там — это вы, то есть куча вещей, которые придется изучить. Они уже собраны в списки типа "awesome c++", "modern c++ best practices"

Для проектов есть шаблоны, где уже подобраны средства для сборки, тестов, управления зависимостями, автоформатирования кода, статических анализаторов, санитайзеров, и прочих инструментов, используемых при разработке на C++

Вот например парочка таких:

https://github.com/cpp-best-practices/cmake_template
https://github.com/TheLartians/ModernCppStarter
Re[3]: Почему CLion и VS не предупреждают?
От: T4r4sB Россия  
Дата: 04.05.23 07:55
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот ради этого и стоило создать пост, пусть и подвергнувшись многочисленному высмеиванию. sanitizers, теперь буду знать что это существует.


Не только ради этого. Переснать использовать это гребаное new! Кресты это не шарпик. Оператор new устарел в том смысле в котором ты им пользуешься. И аллокация в куче у тебя тут нахрен не нужна
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[10]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 04.05.23 08:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>мусор типа оператора new, кстати нахрена он нужен после 11 года?


Если не брать в рассмотрение placement new, то разве что для создания объектов с private/protected конструкторами.
Re[5]: Почему CLion и VS не предупреждают?
От: serg_joker Украина  
Дата: 04.05.23 08:23
Оценка: +1
Здравствуйте, Shmj, Вы писали:

>>>а что в С# настолько все плохо и нет работы, что шарписты набежали в тему С++ ?


S>Я, пока был в горячей точке под бомбами, — начал думать о состоянии IT глобально. Все равно электричества не было и делать было нечего.

S> ...
S>Проанализировал все это и понял что от С++ все-равно никуда не уйти.

Ход мысли и вывод так себе, но это не так важно.
Важно то, что для вменяемого человека, пришедшего к такому выводу, следующим логичным шагом будет взять и почитать книги, а не браться за работу на С++ и заваливать форумы спамом.
Re[11]: Почему CLion и VS не предупреждают?
От: T4r4sB Россия  
Дата: 04.05.23 08:28
Оценка:
Здравствуйте, so5team, Вы писали:

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


TB>>мусор типа оператора new, кстати нахрена он нужен после 11 года?


S>Если не брать в рассмотрение placement new, то разве что для создания объектов с private/protected конструкторами.


Мне казалось что для этого используются статик методы, создающие объект
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 04.05.23 08:39
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Если не брать в рассмотрение placement new, то разве что для создания объектов с private/protected конструкторами.


TB>Мне казалось что для этого используются статик методы, создающие объект


Простенький пример:
#include <memory>

class manager;

class worker {
    friend class manager;

    int i_;
    worker(int v) : i_{v} {};
public:
    int i() const noexcept { return i_; }
};

class manager {
public:
  int do_something() {
    std::unique_ptr<worker> in{ new worker(0) };
    return in->i_;
  }
};

int main() {
    manager o;
    return o.do_something();
}


В manager::do_something не получится использовать std::make_unique, т.к. конструктор у worker-а приватный.
И не важно, будет ли do_something статическим или нет.
Re[11]: Почему CLion и VS не предупреждают?
От: serg_joker Украина  
Дата: 04.05.23 08:44
Оценка:
Здравствуйте, so5team, Вы писали:

TB>>мусор типа оператора new, кстати нахрена он нужен после 11 года?

S>... то разве что для создания объектов с private/protected конструкторами.
Да и тут во многих случаях (если я правильно понимаю, речь про make_shared/make_unique) необязательно. Но я тоже, бывает, делаю через new в таких случаях.

ну или если конкретный тип умного (или неумного) указателя может быть разным в шаблоне. Вроде такого(иллюстративно):

template<typename PTR>
PTR Dup(const PTR& srcPtr)
{
  // can't use `make_unique`/`make_shared`
  return PTR{new std::remove_cvref_t<decltype(*srcPtr)>{*srcPtr}};
}


Ну и наверняка что-то ещё реальное есть.
Отредактировано 04.05.2023 8:47 serg_joker . Предыдущая версия .
Re[13]: Почему CLion и VS не предупреждают?
От: serg_joker Украина  
Дата: 04.05.23 09:08
Оценка:
Здравствуйте, so5team, Вы писали:

TB>>Мне казалось что для этого используются статик методы, создающие объект

S>Простенький пример:
S>[...]
В этом примере место создания `unique_ptr` находится вне `worker`, хоть и в дружественном классе.
T4r4sB предполагает, что такое как бы и должно решаться статик методами (и решается, но с оговорками, см. комментарии):

class worker {
private:
    int i_;
    worker(int v) : i_{v} {};

public:
    static std::unique_ptr<worker> Create(int v) {
#if 0
        // This one fails because `make_unique` tries to access private Ctor
        return std::make_unique<worker>(v);
#else
        // We are enforced to use `new` in this case.
        return std::unique_ptr<worker>{new worker(v)};
#endif
    }
};


т.е. проблема в том, что нам нужно вызвать `make_unique<worker>`, а уж он-то и не может добраться к нашему закрытому конструктору.

Решается либо через new, как в примере, либо через passkey idiom

Сделать `make_unique<worker>` другом, вроде как, нельзя.
Отредактировано 04.05.2023 9:14 serg_joker . Предыдущая версия . Еще …
Отредактировано 04.05.2023 9:13 serg_joker . Предыдущая версия .
Re[14]: Почему CLion и VS не предупреждают?
От: so5team https://stiffstream.com
Дата: 04.05.23 09:13
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>т.е. проблема в том, что нам нужно вызвать `make_unique<worker>`, а уж он-то и не может добраться к нашему закрытому конструктору.


Да.

_>Решается либо через new, как в примере, либо через passkey idiom


Да.
Re[5]: Почему CLion и VS не предупреждают?
От: reversecode google
Дата: 04.05.23 10:29
Оценка:
теперь то вас никто не бомбит
да и свет есть постоянно
можно же закинуть этот не понятный вам С++ и вернутся к вашей деятельности ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.