Комментарии 23
P.S. И да, я, в отличие от многих, не призываю вас это сделать «прям щаз», а то «я на вас обижусь». Как раз то, что продажа сложных продуктов, требующих внедрения начинается со «звонка оператору» — это нормально. Просто это показатель того, что «это вот — всё ещё продукт для избранных, не для всех».
std::vector<size_t> v1( 10, 1 ); // размер 10, инициализирован единицами
std::vector<size_t> v2{ 10, 1 }; // размер 2, заполнен числами 10 и 1
Уже были ситуации, когда, по невнимательнсоти, писал не те скобки. Если не повезёт с типами, то даже скомпилируется…
Прошу привести кратное описание желаемых диагностик с примерами.
Нужно сначала на всех доступных проектах найти такие случаи, попытавшись понять — а сколько их, собственно, вообще бывает. Дальше — прикручивать эвристику.
То есть, наверное, бывают такие случае легитимного использованя, но так как я никогда таких не видел, то даже не могу себе представить какая там может быть эвристика.
Может даже оказаться, что два элемента в списке инициализации — уже сама по себе неплохая эвристика…
К счастью, этот код скомпилируется только для целых чисел и в большинстве случаев оибка обнаружится при первом же запуске. Н опридётся долбиться в глаза, тчобы различие скобочек увидеть. Переживу :)
for (const auto i : v1) {
std::cout << std::dec << i << std::endl;
}
Как вы предлагаете догадаться анализатору что на самом деле хотел сделать автор? Почему, допустим, версия с v1 должна считаться ошибкой а v2 нет или наоборот :-?
Белой завистью завидую мощи инструментов! К сожалению, до мира golang нескоро подобное дойдёт. Но даже прикручивание пачки линтеров в CI даёт отличные результаты: уменьшается нагрузка на code review, появляется объективное обоснование исправления кода с ошибкой или небезопасным поведением, что важно для некоторых товарищей, легче вводить людей в проект. Вообще "всё, что может быть автоматизировано, должно быть автоматизировано".
многим ошибкам быть в валидном кодето виноват язык.
Ну, зато они начнут "бороться с уродством и убогостью" D, например, допиливать местный gc, без которого сейчас в D по большому счету особо не обойтись. Это вообще одно из основных больных мест D, регулярно поступают предложения сделать хотя бы ARC а-ля поздний objc/Swift, но пока воз и ныне там. Короче, серебряной пули, как обычно, не существует.
Моя мысль сводится к тому что самое разумное для сообщества было бы ивестировать свои силы в то что можно улучшить, например в D.Зачем?! Языков с GC — как грязи. Популярных, хороших, используемых: C#, Go, Java…
Вы же вроде про замену C++ вякали? Ну так тут GC должен отсутствовать. Пока что в этой нише один серьёзный игрок: Rust.
Его потихоньку пробуют… Но заменить C++ он пока не готов…
Любое «улучшение» С++ (= приделывание костылей) лишь будет сильнее затягивать его в пучину переусложненного синтаксиса и нагромождения разнородных идей, криво сшитых белыми нитками.Поживём — увидим. Пока что C++ успешно пережил с полдюжины попыток «замены». Часть — ушла в небытиё, часть — заняла какую-то нишу. Но вытеснить C++ никому пока не удалось…
К сожалению, С++ действительно пережил несколько попыток замены. Только какой ценой? Тысяч человек-лет потраченных на реализацию крайне раздутого и переусложненного стандарта? А сколько человек-лет потрачено на создание сопутсвующих инструментов? Все эти усилия могли бы быть использовану с гораздо большей пользой.
Пффф, а что вообще можно сказать по существу предложений типа "имею мнение, что язык X говно, давайте его выкинем и перепишем все на Y"? Это фанбойский тип мышления, спорить с ним бесполезно. Всё, что я хотел сказать по существу, я уже выше сказал.
Я сам в последнее время изрядно зафанател от того же Rust, но — нельзя просто так взять и перестать использовать C++, особенно в достаточно больших проектах. Начать понемногу внедрять альтернативный язык — да (и то, взаимодействие кода на C++ с другими языками — это порой та ещё головная боль). Но не более, по крайней мере, на начальном этапе.
Статический анализ улучшит кодовую базу сложных C++ проектов