LINUX.ORG.RU
ФорумTalks

Visual C++ STL code review

 ,


2

2

Больше открытости от Microsoft :)

На этот раз решили показывать code review C++ STL для всех желающих. Это первое видео, записанное в январе, в будущем будут выложены более новые видео.

Если вам интересно узнать как проходит code review в Майкрософт: https://www.youtube.com/watch?v=FUzrnHEiFI0

Обещают обновлять список code review: https://www.youtube.com/playlist?list=PLReL099Y5nRffygixwNJhENbYxhuJL6Ei

Кто-нибудь знает есть ли подобное у LLVM/gcc или просто у других языков?

★★★★★

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

Как видим, он выбрал вилкой в глаз.

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

А они что, STL сами писали?
★★★★★

ЛОР. Итоги.

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

А они что, STL сами писали? Зачем? Есть же готовые варианты.

Microsoft является лидером по скорости реализации стандартов С++ сейчас.

https://www.reddit.com/r/cpp/comments/na39g6/visual_studio_2019_preview_is_now_c20/

MSVC finished C++20 before GCC? What a time to be alive!

fsb4000 ★★★★★
() автор топика
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Microsoft является лидером

Этот ЛОР. Тут надо начинать с того, что у Microsoft вообще свой компилятор, и она является членом комитета стандартизации.

LamerOk ★★★★★
()

Люблю их компилятор за то, что сгенерированные бинарники не прощают ошибок, связанных с выходом за границу и висячими ссылками. Даже в release, про debug с отладочными итераторами и не говорю. Сколько же говнокода при портировании валится там где авторы, пишущие и запускающие только на Linux или MacOS думали что всё просто прекрасно. Однако вместе с тем сам по себе он падуч - одно время ICE-шки чуть ли не каждый месяц репортил.

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

Потому что он живет в свободной стране.

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

Люблю их компилятор за то, что сгенерированные бинарники не прощают ошибок, связанных с выходом за границу и висячими ссылками.

А что, санитайзеры это не ловят?

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

Microsoft является лидером по скорости реализации стандартов С++ сейчас.

А, ну да, в кой-то веке и они стали шевелиться. Какое достижение. Вот до предыдущих стандартов они последние добирались, ну или одни из последних.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от shooter93

Да тысячи их. Из недавнего:

// i + j <= vec.size()
std::vector<int> subvec(&vec[i], &vec[i+j])

несмотря на то, что проверка есть, из-за приоритета операций (сначала скобки, потом адрес) всё равно делается обращение к несуществующему элементу.

Либо такое:

// vec.size() == 4
std::vector<int> subvec(vec.begin(), vec.begin() + 3 + 2 - 4)

несмотря на то что результат vec.begin() + 3 + 2 - 4 попадает в диапазон, выражение вычисляется слева направо и промежуточное выражение не попадает в диапазон и итератор сдвигается за пределы vec.end().

В обоих случаях бинарники собранные микрософтовским компилятором крэшились (второе только в debug), а от gcc продолжали работу c UB.

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

А что, санитайзеры это не ловят?

Ловят. Но тут значительно более строгое поведение по дефолту.

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

Первый пример очевиден даже мне, хреново знающему плюсы, а вот второй удивил. Это что получается, нельзя, чтобы итератор указывал за пределы последовательности, даже если мы по нему никогда не обращаемся? Какое-то драконовское ограничение…

А как такие вещи правильно на C++ делать, чтобы это не было говнокодом - скобки расставлять?

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

А они что, STL сами писали? Зачем?

Microsoft одни из первых делали компилятор C++ и библиотеку под него. Ещё в Win16 C++ был доступен. У компилятора от Microsoft большая история.

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

Это в каком это с++ происходит проверка выхода за диапазон длины вектора в операции vec[i+j]?.. Насколько мне известно, это делает только метод at()

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

В Visual C++ 4.1 поставлялась оригинальная STL от HP.
Потом они лицензировали STL от Dinkumware и на ее основе сделали свою.

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

ЕМНИП, разрешено только сравнение с адресом элемента после последнего (то есть ровно то что делает end()). Адрес за пределами end() всё равно в сравнении или разыменовывании использовать нельзя, так что брать его смысла нет. Итераторы это диагностируют в конструкторе и падают с табличкой.

Починить можно скобками или временной переменной (там в действительности не 3, 2, 4, а довольно длинные вызовы функций).

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

В constexpr компиляторы лучше проверяют на наличие UB :)

libc++ ещё не поддерживает constexpr vector, но с массивами теже правила: https://gcc.godbolt.org/z/drYs9cYqo

MSVC: https://gcc.godbolt.org/z/ba1as8Te1

fsb4000 ★★★★★
() автор топика
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Ага, только я про первый пример спрашивал

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

Да тысячи их. Из недавнего:

// i + j <= vec.size()
std::vector<int> subvec(&vec[i], &vec[i+j])

Пардон за глупый вопрос, а где вообще описано, что можно совать в vector::operator[], а что нельзя? В [sequences] не нашёл ничего, в [containers] тоже.

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

Может @fsb4000 поможет?

Не, я не знаю где в стандарте. Мне хватает ассертов:

https://github.com/microsoft/STL/blob/1866b848f0175c3361a916680a4318e7f0cc5482/stl/inc/vector#L1564-L1567

и

https://github.com/microsoft/STL/blob/1866b848f0175c3361a916680a4318e7f0cc5482/stl/inc/vector#L1574-L1577

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