Top.Mail.Ru
? ?
Ни о какой безапелляционности в моих высказываниях не может быть и речи! [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

баг (программистское) [май. 3, 2018|02:39 pm]
Anatoly Vorobey
[Tags|]

Какой прекрасный баг. Можно показывать школьникам и студентам, заинтересованным в программировании, чтобы знали, что им предстоит. И в хорошем смысле, и в плохом.

Missing red channel in Chrome Remote Desktop

Если вы разбираетесь в C++, почитайте сами, а если нет, то вот краткий пересказ:

1. В Хроме, когда он используется для удаленного захода на другой компьютер (Chrome Remote Desktop), внезапно пропал красный цвет, в том числе из комбинаций цветов (так что белый фон стал сине-зеленым, например).

2. Идем по истории изменений, находим, что это произошло в изменении, которое не меняло исходники, а вместо этого перешло к новой версии компилятора ("roll clang"). Вечер перестает быть томным.

3. Ищем и находим способ "дешево" воссоздать проблему для данного набора исходников (в данном случае - как сделать "удаленный" вход внутри одного компьютера).

4. Берем исходники в этот момент, строим две версии компилятора, старую и новую. Компилируем все дерево исходников старой - бага нет, новой - баг есть. Компилируем все дерево старой, и начинаем искать, какие исходники приводят к проблеме, если только их построить новой.

4. Постепенно сужаемся до большой компоненты дерева...

5. ...до конкретной директории...

6. ...до нескольких файлов...

7. ...до одного файла...

8. Находим массивы констант, которые используются для перевода цветов из режима YUV в режим RGB. Массивы определены внутри функции и внутри блока кода, но не помечены static. При этом используются уже после выхода из этого блока кода, через указатель, естественно.

9. Помечаем массивы static, проблема решена. Проблема была вызвана тем, что новая версия компилятора более агрессивно использовала локальное место на стеке, когда она знала, что ей позволено (потому что блок кода завершился и эти массивы должны использоваться только в нем).

И так каждый день! (примечание: не всегда так цветисто).
СсылкаОтветить

Comments:
Страница 1 из 3
<<[1] [2] [3] >>
From: p_a_s_h_a
2018-05-03 11:55 am
Вот, в ECMAScript 2015 с аналогичным кривым использованием переменных бороться пытались - и ввели let и const...
А тут - прямо компилятором по стеку! Агрессивно!
(Ответить) (Thread)
[User Picture]From: prol_prolych
2018-05-03 11:56 am
Массивы констант используются через указатель после выхода из блока кода, в котором они объявлены? :о)))
За такое убивать надо!
Причём и кодера, который такое пишет и тех, кто такой компилятор накосолапил, который такое пропускает.


(Ответить) (Thread)
[User Picture]From: dzz
2018-05-03 12:03 pm
Принципиально, что не просто указатель, а на стек.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: dzz
2018-05-03 12:01 pm
Что характерно, компилятор совершенно прав :)
Напоминает ситуацию с правоприменением, когда начинает энфорситься какой-то давно принятый закон, на который раньше просто забивали. Вроде, всё по правилам, но неуютно, в данном случае - для неаккуратного кода.
(Ответить) (Thread)
[User Picture]From: tlkh
2018-05-03 12:15 pm
Вот сегодня как раз такой баг правил, с указателем на локальную переменную. Только там не было выхода из блока, зато был рекурсивный вызов.
(Ответить) (Thread)
[User Picture]From: pargentum
2018-05-03 12:16 pm

Вообще-то статья расстрельная

А на неделе хозяйка велела вернуть буфер из служебной функции, а я объявил локальный массив внутри функции и на него указатель вернул. А она взяла стэк с мусором и начала моей харей по ему водить...
(Ответить) (Thread)
[User Picture]From: avva
2018-05-03 03:21 pm

Re: Вообще-то статья расстрельная

Смешно, но это не тот случай.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: lev_m
2018-05-03 12:16 pm
воссоздать = воспроизвести
(Ответить) (Thread)
[User Picture]From: mynine
2018-05-03 12:22 pm
А какого хрена компилятор не выдал предупреждение ?! Или читать вывод компилера не метод суровых профи? :)
Я тупо сейчас проверил свой GCC на такой кейс:
"warning: address of local variable 'xxxx' returned [-Wreturn-local-addr]"
(Ответить) (Thread)
[User Picture]From: drmor
2018-05-03 12:32 pm
Насколько я понял, там было не returned, а передавалось в функцию, которая (надо понимать) запоминала указатель.

gl_->UniformMatrix3fv(yuv_matrix_loc_, 1, 0, yuv_matrix);
gl_->Uniform3fv(yuv_adjust_loc_, 1, yuv_adjust);
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: vitus_wagner
2018-05-03 12:32 pm
Этот браузер был хром.
(Ответить) (Thread)
From: igoretz
2018-05-03 05:40 pm
Причем он от рождения был хром.
(Правда, сейчас это принято называть "альтернативный браузер".)
(Ответить) (Parent) (Thread)
[User Picture]From: a_konst
2018-05-03 12:34 pm
Прекрасный баг?!!!
Это ж детский сад просто, выдавать наружу указатель на переменные на стеке.
(Ответить) (Thread)
From: (Anonymous)
2018-05-03 01:48 pm
"Решение" в виде static унутре блока тоже порадовало.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: alaev
2018-05-03 12:46 pm
И что, вся наша цивилизация основана вот на таких кривых, кустарных алгоритмах? Какой ужас. Пора уже, товарищи программисты, выходить на какой-то новый уровень качества. А то ведь ненароком все передохнем.
(Ответить) (Thread)
[User Picture]From: prol_prolych
2018-05-03 12:50 pm
За здоровую ретроградчину! Долой новые версии компиляторов!
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: Serge Raynt
2018-05-03 01:21 pm
PVSStudio вроде бы находил этот баг статическим анализом в хромиуме.
(Ответить) (Thread)
[User Picture]From: dreamer_other
2018-05-04 03:41 am
PVSники уже много лет публикуют статьи о проверке хромиума и все сокрушаются, что до сих пор нет покупки. Если баг действительно находили, то самое время для новой статьи "а мы же говорили".
(Ответить) (Parent) (Thread)
From: (Anonymous)
2018-05-03 02:08 pm
utter waste of time
valgrind is your friend
address sanitizer is your friend
ub sanitizer is your friend
(Ответить) (Thread)
[User Picture]From: scaredy_cat_333
2018-05-04 05:17 am
Это все, подозреваю, тулзы продлевающие патриархальные стереотипы. Когда люди начинают бороться за гендерное выравнивание команд, то им не до них.
(Ответить) (Parent) (Thread)
From: rezkiy
2018-05-03 02:10 pm
а кланг-чек такое разве не ловит?
(Ответить) (Thread)
From: (Anonymous)
2018-05-03 02:51 pm
нет, вроде не ловит.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2018-05-03 02:43 pm
Для особо любознательных, баг там был примерно такой:

void buggy_function()
{
float* table = nullptr;
if (some_condition) {
float another_table[] = { 0.1, 0.2, 0,3 };
table = another_table;
}
some_other_function(table);
}

(Ответить) (Thread)
[User Picture]From: avva
2018-05-03 02:52 pm
Да. И проблема не в том, как подумали некоторые, что some_other_function запоминает значение table где-то и позже оно используется после выхода из функции.

Проблема в том, что другие локальные переменные, перед вызовом some_other_function(), расположены в том же месте стека, что another_table, и меняют часть ее значений, в результате чего some_other_function получает частично коррумпированную таблицу.
(Ответить) (Parent) (Thread) (Развернуть)
From: (Anonymous)
2018-05-03 03:12 pm
Ну, тут все-таки баг был, хоть и не проявлялся. У меня как-то было интереснее: баг, который в код никто не вносил. Просто после перехода с LinuxThreads на NPTL в legacy коде появились race conditions из-за того, что getpid() стала возвращать не thread ID, как раньше, а process ID.
(Ответить) (Thread)
Страница 1 из 3
<<[1] [2] [3] >>