LINUX.ORG.RU

Помогите разобраться, это баг LLVM или нет

 , , , ,


0

2

Есть С++ проект который я собираю clang-ом, с гитхаба состояние актуальное(графическая библиотека)(утечек памяти ни на GCC ни на clang/llvm нет)

использую «example.cpp» самого проекта не написав ни строки
суть - «write an anonymous function/lambda that passes itself as a callback»(в гугл кому надо)

псевдо-код такой:

class foo{
 int id;
};

clas bar{
 ...
 void setCallback(const function<...> &callback){...};
 void callCallback(){...};
};

bar global_bar1;
bar global_bar2;

void init(){
 global_bar1=new bar();
 global_bar2=new bar();
 foo local_foo1=new foo();
 local_foo1->id=1;
 global_bar1->setCallback([local_foo1]{cout<<local_foo1->id;});
 foo local_foo2=new foo();
 local_foo2->id=2;
 global_bar2->setCallback([local_foo2]{cout<<local_foo2->id;});
}

void main(){
init();
global_bar1->callCallback();
global_bar2->callCallback();
global_bar1->callCallback();
}

вывод будет:
1
2
...тут неверный вывод

тоесть вызывая global_bar2->callCallback() второй каллбек «первый» исчезнет, крашей не будет он просто исчезнет и будет давать неверный разультат(только последний калбек работает, все предыдущие исчезают)

если:
1. переместить(копипастить) весь метод init в main (в функцию из которой вызывать каллбек) то проблема исчезнет(все калбеки работают)
2. сделать local_foo1 local_foo2 глобальныи - тоже все калбеки заработают

собирая в GCC все калбеки работают, как глобально так и локально объявленные

оригинальный код слишком объемен, сделать «рабочий минимальный код на С++» у меня не вышло(вне структуры того проекта этот баг не работает), желающим читать тыщи строк дам ссыылку на гитхаб конечноже



Последнее исправление: missxu (всего исправлений: 1)

Я думаю что local_foo1 и local_foo2 у тебя не создаются через new, а почему-то живут на стеке.

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

не создаются через new

яж написал ЭТО ПСЕВДОКОД, рабочий такой примербы работал и собирался в GCC и clang одинаково без описанного мной бага

поэтому чтоб не вводить в заблудения я написал что ТАКОЙ псевдо-КОД с внутренними классами и медодами «библиотеки» дает неверный результат Только в clang

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

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

Я понимаю, на дворе 1980 и компьютер есть не у всех. Поэтому будем писать псевдокод на бумажке и искать в нём баги.

ox55ff ★★★★★
()

-Weverything ничего не находит?

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

трололо - напишу неправильный псевдокод, пусть ищут ошибки. Вообще-то проблему может вызвать любая деталь, даже о которой не подозреваешь. И кстати когда обращаешься за помощью, правило хорошего тона - свести всё до 'minimum reproducible example'.

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

пособирал токачто поразному, в clang для x86_64 все работает без бага

для нужной мне архитектуры баг есть

похоже что таки LLVM

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

Советую привести реальный неработающий пример программы. Обычно баги не в компиляторах, а программах.

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

реальный работающий пример состоит из трех проектов на гитхабе, уверен на 99% что никто не станет в этом разбираеться

и выделить все объекты в глобальные мне не сложно

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

Если у тебя в gcc работает а в clang не работает, значит идея такая, собираешь половину обьектников gcc, половину шлангом, линкуешь все вместе и проверяешь работает или нет. Если не угадал берешь другую половину, если угадал, то делишь на два. И так за логарифм находишь конкретный файл что у тебя не работает. Дальше из него выкидываешь код пока не найдешь одну функцию которая работает не так, и делаешь из нее минимальный пример.

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

Если у тебя в gcc работает а в clang не работает, значит идея такая, собираешь половину обьектников gcc, половину шлангом, линкуешь все вместе и проверяешь работает или нет.

GCC не поддерживает целевую архитектуру, только там есть баг

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

webassembly

llvm ее поддерживает, я пробоал две версии 5.0 и 6.0, везде есть этот баг

missxu
() автор топика

Внезапно, при кодинге на Java столкнулся с такойже проблемой

но в Java есть предупреждение по этому поводу:
«local variables referenced from a lambda expression must be final or effectively final»

поэтому вынося в глобальные я и делал их «финальными», и все начинало работать

забавное совпадение

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

еще один читать не умеет, зато какой умник!

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

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

https://github.com/danilw/getting-over-glsl/blob/master/agame2.cpp

со строки 152-158 перенеси в конструктор 170+ строка, методы калбека исчезнут, так как они вызываются из другой функции

тут

https://github.com/danilw/nanogui-GLES-wasm/blob/master/example1.cpp

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

удачи собирать это братан

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

Сделай минимально рабочий вариант воспроизведения «бага». ;3

оригинальный код слишком объемен, сделать «рабочий минимальный код на С++» у меня не вышло(вне структуры того проекта этот баг не работает), желающим читать тыщи строк дам ссыылку на гитхаб конечноже

даже более конкретно, «багаются» только две переменные ID окна(виджета) и ID GLFW, калбек какбы работает но наполовину, то что вызывается до взятия ID(там калбек вызывается другим калбеком который другим калбеком ...) работает, любой код (я тестил правкой кода проекта) который идет после взытия любого из ID просто пропадает

идет вызов всех калбеков по очереди-> дохидит до GLFW_действи(ID) или виджет_действие(ID), сама функция вызывается но там неверный ID всегда, и после этого весь следущий код просто пропадает

сори за стену, минимального примера я не могу сделать

missxu
() автор топика

готовый скомпилированный бинарник с дебаг отладкой под отладчиком ? не не слышали, на улице 2018 год

anonymous
()
29 июня 2018 г.

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

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