LINUX.ORG.RU

Типичные ошибки C++


0

0

Martin Michlmayr пересобрал 6200 пакетов Debian свежим компилятором GCC 4.1. При этом было обнаружено более 500 новых багов, из которых 2/3 приходятся на типичные ошибки с С++-коде.

Подробный отчёт: http://lists.debian.org/debian-devel/...

>>> Памятка кодеру

anonymous

Проверено: Shaman007 ()
Ответ на: комментарий от lenin

Если твоя программа оттранслировалась без ошибок, скажи об этом системному программисту - он исправит ошибку в трансляторе. (C)

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

Чем более кривой код будет компилироваться в рабочую программу - тем
больше будет программ.

А уж сделать ее некривой в бинарнике - задача компилятора.

а уж убирание поддержки кода. подходящего для более старых версий компилятора - вообще преступление.

Lockywolf ★★★
()

и что ради вот этого стоило писать статью:

class foo
{
public:
foo::foo();
};

?

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

> Чем более кривой код будет компилироваться в рабочую программу - тем больше будет программ.

Нефиг-нефиг. Кол-во кривого кода и так растет как снежный ком. Если не предпринимать хотя бы минимальных усилий по его уменьшению (на уровне технологии) - будет еще хуже. Кривой код - фтопку.

> А уж сделать ее некривой в бинарнике - задача компилятора.

Достойная задача для AI - сделать из кривого кода прямой бинарник. "Сделай не то, что я тебе приказал сделать, а то, что я хотел, чтоб ты сделал". Телепаты срочно вернулись из отпуска.

> а уж убирание поддержки кода. подходящего для более старых версий компилятора - вообще преступление.

Так компиляторы становятся bloatware. Компилятор - средство не для end-user. Если у человека есть мозги, чтоб заниматься компиляцией - пусть заточит сырцы под новую версию (редко бывает так, чтоб было совсем непонятно, как затачивать - впрочем, документацию на эту тему разработчики компиляторов обычно предоставляют в каком-то виде).

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

> а уж убирание поддержки кода. подходящего для более старых версий компилятора - вообще преступление.

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

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

>svu *** (*) (05.04.2006 18:26:39):Так компиляторы становятся bloatware. Компилятор - средство не для end-user. Если у человека есть мозги, чтоб заниматься компиляцией - пусть заточит сырцы под новую версию (редко бывает так, чтоб было совсем непонятно, как затачивать - впрочем, документацию на эту тему разработчики компиляторов обычно предоставляют в каком-то виде).

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

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

>Чем более кривой код будет компилироваться в рабочую программу - тем больше будет программ.

Не факт. В плане перевариваемости кода, скажем, у нас такая цепочка: Perl > Си > Java > VB.

На практике популярность распределяется как: Java > Си > Perl > VB.

Как видим, корреляции не наблюдается :)

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

> Не факт. В плане перевариваемости кода, скажем, у нас такая цепочка: Perl > Си > Java > VB.

цепочка пищеварения у разных видов может отличаться

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

>цепочка пищеварения у разных видов может отличаться

Тьфу, это я тут параллельно заболтался :) Имелось в виду:

Perl > VB > Си > Java.

Или ты с каким-то моментом не согласен? ИМХО, Perl позволяет писать более "вольный" код, чем VB, VB - более "вольный", чем Си и т.д.

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

В таком виде корреляция очень даже наблюдается. Это как раз неплохое доказательство (или объяснение), почему жабка рулит;)

svu ★★★★★
()

Не слушаёте картавого деда - 3.14здит как дышит. Я только недавно перелопачивал проект после перехода с MSVC 7.0 на MSVC 7.1, так что там всё то же самое, только хуже.

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

>Языки НЕ развиваются. Последним версиям стандартов ISO на С и С++ уже многов времени. А вот пингвиньи компиляторы почему-то развиваются.

Вызывающе неверная информация. Языки развиваются, появляются новые стандарты. А компиляторы до сих пор не все стандартам соответствуют. И особенно это до последнего времени касалось vc++. Сейчас они вроде что-то правят в этом направлении, одумались.

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

> Ещё - ?

ghc (не на 100% уверен). PyPy. Некоторые реализации Common LISP. Моновский компилятор C# (на чем там VM - я не помню).

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

"парниковый эффект вызван гигантским выбросом метана" (c) talks

Казалось бы, причем тут lenin?

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

>Некоторые реализации Common LISP

Какие интересно?

>Моновский компилятор C# (на чем там VM - я не помню).

VM у них на bash-е есно.

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

>ocaml, например.

Из OCaml, на мой взгляд, букву O можно безболезненно выкинуть:)

> Правда я не знаю как он собирается.

Да хоть в байт-код, хоть в натив.

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

>Из OCaml, на мой взгляд, букву O можно безболезненно выкинуть:)

Обоснуй.

>Да хоть в байт-код, хоть в натив.

Это я знаю. Вопрос в том: можно ли его считать самосбирающимся. В дереве исходников, помнится, были куски кода на Ц. Но сколько их было и чем они занимались я не помню.

ugoday ★★★★★
()
Ответ на: Хочется сострить от ugoday

>Типичной ошибкой С++ программиста является выбор С++ в качестве ЯП

Вот вот. В нормальных ЯП уже существуют статические анализаторы кода http://research.compaq.com/SRC/esc/ http://findbugs.sourceforge.net/, а C++ники все еще ищут утечки ресурсов и потерявшиеся указатели.

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

>Обоснуй.

Это субъективное мнение.

>Вопрос в том: можно ли его считать самосбирающимся

Да.

>В дереве исходников, помнится, были куски кода на Ц. Но сколько их было и чем они занимались я не помню.

Обертки к функциям ОС или некоторые внутренние функции, переписанные на C с целью оптимизации.

Там, кстати, даже асм есть.

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

ЕМНИП, интерпретатор байт-кода и отдельные модули из библиотеки

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

На C там только VM и куски библиотеки. Компилятор на OCaml, бутстрапится из скомпилированных в байткоды бинарников.

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

А зачем тебе кривые программы написанные криволапыми идиотами? Не нужны такие программы. Чем больше из них можно будет выбросить на помойку, тем лучше.

anonymous
()

6200 пакетов? он что, терминатор??

vilfred ☆☆
()
Ответ на: комментарий от svu

> ЗЫ Я не помню - я говорил, что плюсы гадость?;)

А разве корпоративные требования у гномеров позволяют НЕ говорить (я бы даже сказал - НЕ вопить) об этом на каждом углу?

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

> ООП на С - это тяжкий труд;)

Я бы даже сказал - сизифов труд. И результат - тормозной gtk.

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

> Сначала - разработчикам WinAPI, xlib, libc (stdio.h) etc. etc.

А чё, гном и WinAPI - ровесники? Или гномы обожают наступать на грабельки, по которым все уже прошлись лет 10 назад?

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

>А чё, гном и WinAPI - ровесники? Или гномы обожают наступать на грабельки, по которым все уже прошлись лет 10 назад?

а libc - тоже грабельки? или у ананимуса просто мозгов не хватает понять, что использование C++ в библиотеке/тулките - это дурной тон?

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

>вот это моветон

ты знаешь, куда тебе идти? вот и иди

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

> А тогда весь пингвиникс написан кретинами. Попробуй собрать что-нить десятилетней давности. Выложить ?

Это ты собственную мазню тут собрался выкладывать как образец, что ли? А, ну давай, давно анекдотов на C не было.

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

> а вообще говоря мысль! пытаться собрать свои проекты сразу несолькими компиляторами. если ни один не ругнётся - код верный

Причём желательно - компиляторами разных языков. В сухот остатке получим программу из одного символа ";", которая и олицетворяет абсолютную истину.

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

>а C++ники все еще ищут утечки ресурсов и потерявшиеся указатели.

Это те кто не умеет программировать на С++. Остальные пользуются smart pointers & Co и горя не знают =)

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

>Ни одного из "трёх китов" - ни полиморфизма, ни наследования, ни инкапсуляции. Доступ к полям "объектов" через точку - это ещё не ООП :)

Ну не спорь ты, не видишь что ли: тут сидят супер-спецы ООП.... =)))

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

>Я не помню

А вот если бы ты программировал на плюсах, у тебя бы была прекрасно натреннированная память.

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

Не грошь, а 12 баксов в час, дяденька.

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

Гы гы гы :). Знаток Цэ Пэ Пэ компиляторов :).

eXOR ★★★★★
()

anonymous (*) (05.04.2006 13:06:59)
> Какой бред программировать на С++, на на Си.

svu *** (*) (05.04.2006 13:15:31)
> ЗЫ Я не помню - я говорил, что плюсы гадость?;)

От анонимусов такое слышать неудивительно, но от тебя svu я не ожидал услышать подобный бред. Признаться, у меня раньше тоже было предубеждение насчет C++, да и пишу я сам до сих пор именно на C, но... Первый же проект на C++, который приходит в голову это rxvt-unicode. Качество отменное. И по скорости и по фичастости. Например, сравним данный продукт по скорости вывода текста с XTerm, который написан на чистом C. И в том и другом случае настройки шрифтов (и там и там Courier New, который выводится через xft), jumpscroll'ы, абсолютно аналогичны, если кто не поверит могу выслать оба конфига.

[9:53]gentoosiast@breeze% ls -lR /dev|wc -l [~]
462

Теперь запускаем рекурсивный вывод ls -l под XTerm и URxvt (запускал по несколько раз, брал последний результат, так что не надо гнать, что там что-то закэшировалось):

[10:14]gentoosiast@breeze% urxvt -h 2>&1|head -n 1 [~]
rxvt-unicode (urxvt) v7.5 - released: 2006-01-31
[9:55]gentoosiast@breeze% time ls -lR /dev|less [~]
... long output skipped ...
real 0m0.511s
user 0m0.017s
sys 0m0.008s

[10:12]gentoosiast@breeze% xterm -version [~]
XTerm(200)
[9:55]gentoosiast@breeze% time ls -lR /dev|less [~]
... long output skipped ...
real 0m1.797s
user 0m0.029s
sys 0m0.022s

Как говорится комментарии излишни. И это притом, что XTerm до сих пор не может выводить заголовках окон и в Icon Names текст в кодировке отличной от ISO 8859-1. Может если локаль UTF-8, то все и нормально, но под восьмибитной KOI8-R вы кириллического текста там не увидите. Томасу я про это писал, он это обещал поправить, но в URxvt это работало с незапамятных времен. Наверняка здесь люди смогут привести еще примеры, это первое что пришло мне в голову из тех проектов на C++, которыми я сам пользуюсь и доволен ими.

Так что не нужно обобщать, что все проекты на C++ гамно, наверное все же качество больше зависит от таланта программист(а|ов).

svu, лучше будь добр, дай URL на описание GNOME hints, а то что-то на вашем портале найти не могу

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

Блин, не туда попал :( Хотел написать к языкам высокого уровня, компиляторы которых собирают сами себя. Хотя наверно нет языков програмирования уровнем ниже асма.

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

Для развития памяти жабка помогает. Запомнишь весь J2SE API - и память как бицепсы у Ван Дамма;) (На всякий случай - я, конечно, не помню;)

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

> Первый же проект на C++, который приходит в голову это rxvt-unicode. Качество отменное. И по скорости и по фичастости

Да, на С++ можно написать хороший код (я обратного нигде не утверждал). Вопрос, сколько лет надо писать плохой, чтоб научиться писать хороший? И сколько стоит поддержка этого плохого плюсового кода?

> Например, сравним данный продукт по скорости вывода текста с XTerm, который написан на чистом C.

На С можно написать плохой код. Примеры не могут быть доказательством. Особенно если их всего два.

> Так что не нужно обобщать, что все проекты на C++ гамно

Где я это сказал??? Я утверждаю, что С++ - гадость. Но никогда не говорил, что все плюсовые проекты никуда не годятся. Цитируйте, пожалуйста, точнее.

> наверное все же качество больше зависит от таланта программист(а|ов)

Однозначно. Но язык таки определяет многое.

> URL на описание GNOME hints,

Энто хто такое? За время жизни гнома этим словом назывались разные вещи;)

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

> Или гномы обожают наступать на грабельки, по которым все уже прошлись лет 10 назад?

Грабли WinAPI совсем не в том, что он ОО (то же относится к libc и xlibc). Скорее наоборот - в недостаточно последовательном ОО. А менять грабли ОО С на другие - надо иметь достаточно веские основания (и уж тогда лучше брать не плюсы, а что-нибудь managed).

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

> Или гномы обожают наступать на грабельки, по которым все уже прошлись лет 10 назад?

А линуксоиды и бсдшники - предпочитают наступать на грабли, которым более 30 лет? Все на форточки, товарищи! :-(

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