Size: a a a

2020 September 15

K

Konstantin in pro.cxx
Nikita Petrenko
и зачем вообще shared_ptr, если можно просто сырой указатель использовать?
Она вообще на этот вопрос отвечала
источник

K

Konstantin in pro.cxx
?
источник

NP

Nikita Petrenko in pro.cxx
оч смешно
источник

NP

Nikita Petrenko in pro.cxx
))
источник

NP

Nikita Petrenko in pro.cxx
сорян, просто немного угарнул от динамики треда:

TS: хочу утечку памяти!
A1: тебе нужен std::shared_ptr
TS: но зачем shared_ptr, если и обычного указателя хватит?
A2: shared_ptr офигенны!
источник

D

Dmitriy in pro.cxx
Nikita Petrenko
извини, ты мой вопрос прочитала?) Я спрашиваю, по сути, как создать утечку памяти так, чтобы санитайзер не ругался
А это вообще возможно?
источник

NP

Nikita Petrenko in pro.cxx
да, возможно. Например, вот так:
int main() {
   S s;
   std::exit(0);
   // ~S is never called
}
источник

D

Dmitriy in pro.cxx
Видел то ли способ, то ли баг Clang'а - причем без рукоприкладства в виде terminate - но он касается лишь небольших объектов
источник

NP

Nikita Petrenko in pro.cxx
проблема, правда, в том, что std::exit полностью отключает leak sanitizer, насколько я понимаю
источник

OZ

Olzhas Zhumabek in pro.cxx
Nikita Petrenko
да, возможно. Например, вот так:
int main() {
   S s;
   std::exit(0);
   // ~S is never called
}
припоминаю баг в gcc где aggregate initialized объекты не вызывали деструкторы мемберов в мэйне
источник

D

Dmitriy in pro.cxx
Попробую сейчас найти. Там в начале main'a нужно было string создать, и дальше утечку десятка интов санитайзер не видел
источник

D

Dmitriy in pro.cxx
Переслано от Alexander Logumanov
Привет, столкнулся со странным поведением санитайзера, может кто подскажет. У меня есть две машины: на одной Fedora 32, на другой Arch LInux. На обеих стоит clang 10.0.0. И есть простой код с утечкой памяти:
#include <string>
int main() {
 std::string s; // это важно
 int* i = new int;
 return 0;
}

Компилирую так: clang++ main.cpp -o main -g -fsanitize=address. Так вот, на Fedora утечка детектится, а на Arch — нет. Причем, если закомментировать строчку со string, то работает на обеих системах. Почему так происходит?
источник

D

Dmitriy in pro.cxx
После определенного количества начинал видеть утечку.
источник

NP

Nikita Petrenko in pro.cxx
мде, интересно. У меня воспроизводится, сетап такой же как у тебя (arch + clang)
источник

NP

Nikita Petrenko in pro.cxx
на arch по дефолту некоторые проверки у санитайзеров включены, которых нет на федоре (что-то там с целостностью стека было). Это к вопросу, почему поведение может различаться. Но почему clang утечку здесь не ловит, я не понимаю
источник

LY

Leonid Yuriev in pro.cxx
Dmitriy
Переслано от Alexander Logumanov
Привет, столкнулся со странным поведением санитайзера, может кто подскажет. У меня есть две машины: на одной Fedora 32, на другой Arch LInux. На обеих стоит clang 10.0.0. И есть простой код с утечкой памяти:
#include <string>
int main() {
 std::string s; // это важно
 int* i = new int;
 return 0;
}

Компилирую так: clang++ main.cpp -o main -g -fsanitize=address. Так вот, на Fedora утечка детектится, а на Arch — нет. Причем, если закомментировать строчку со string, то работает на обеих системах. Почему так происходит?
Ну я бы еще в сгенерированный машинный код глянул, а то вдруг (по каким-то не показанным причинам) clang до-оптимизировал до mov eax, 0 и ret.
источник

LY

Leonid Yuriev in pro.cxx
Dmitriy
Переслано от Alexander Logumanov
Привет, столкнулся со странным поведением санитайзера, может кто подскажет. У меня есть две машины: на одной Fedora 32, на другой Arch LInux. На обеих стоит clang 10.0.0. И есть простой код с утечкой памяти:
#include <string>
int main() {
 std::string s; // это важно
 int* i = new int;
 return 0;
}

Компилирую так: clang++ main.cpp -o main -g -fsanitize=address. Так вот, на Fedora утечка детектится, а на Arch — нет. Причем, если закомментировать строчку со string, то работает на обеих системах. Почему так происходит?
Проверил.
Товарищ чего-то не договаривает.
Т.е все работает.

$ ./main

=================================================================
==18011==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
   #0 0x4f3507 in operator new(unsigned long) (/home/ly/Загрузки/Telegram Desktop/main+0x4f3507)
   #1 0x4f6255 in main /home/ly/Загрузки/Telegram Desktop/main.cpp:4:12
   #2 0x7fe1105c0041 in __libc_start_main (/lib64/libc.so.6+0x27041)

SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).


$ clang --version
clang version 10.0.0 (Fedora 10.0.0-2.fc32)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
источник

LY

Leonid Yuriev in pro.cxx
А вот с оптимизацией уже ничего не будет.
источник

D

Dmitriy in pro.cxx
Nikita Petrenko
мде, интересно. У меня воспроизводится, сетап такой же как у тебя (arch + clang)
У другого человека баг воспроизвелся.
Неужели просто все вырезается при оптимизации?
источник

VK

Vladimir Kostylev in pro.cxx
Nikita Petrenko
Какой в плюсах канонический способ никогда не вызывать деструктор у объекта? (так, чтобы санитайзеры были счастливы)

Я знаю, что можно эксплуатировать факт, что после std::exit не вызываются деструкторы локальных переменных, стек не раскручивается — не уверен в каноничности
placement new же, нет? буфер культурно удалить, объект висеть останется;
источник