Нет, я не ругаюсь, уже слов нет.
Сегодня один из девелоперов полдня потратил на боиск баги. И вроде всё правильно и с хипом по уму работает. а нет...
Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
#include <memory>
int main()
{
int *p = new int;
*p = 0x123456;
// what's the %@$?
std::auto_ptr<int> x = p;
printf("%08x,%08x\n",*p,x.get());
return 0;
}
Здравствуйте, Alexey Chen, Вы писали:
AC>Нет, я не ругаюсь, уже слов нет. AC>Сегодня один из девелоперов полдня потратил на боиск баги. И вроде всё правильно и с хипом по уму работает. а нет...
То, что он по уму работает с хипом — это, конечно, здорово
AC>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>
AC>#include <memory>
AC>int main()
AC> {
AC> int *p = new int;
AC> *p = 0x123456;
AC> // what's the %@$?
AC> std::auto_ptr<int> x = p;
AC> printf("%08x,%08x\n",*p,x.get());
AC> return 0;
AC> }
AC>
А код привести так сложно? Или каждый просто обязан иметь VS2005?
ЗЫ
К вопросу о прямой инициализации и инициализации копированием:
Comeau:
"ComeauTest.c", line 9: error: no suitable constructor exists to convert from
"int *" to "std::auto_ptr<int>"
std::auto_ptr<int> x = p;
^
"ComeauTest.c", line 11: warning: argument is incompatible with corresponding
format string conversion
printf("%08x,%08x\n",*p,x.get());
Здравствуйте, Alexey Chen, Вы писали:
AC>Нет, я не ругаюсь, уже слов нет. AC>Сегодня один из девелоперов полдня потратил на боиск баги. И вроде всё правильно и с хипом по уму работает. а нет...
AC>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>
AC>#include <memory>
AC>int main()
AC> {
AC> int *p = new int;
AC> *p = 0x123456;
AC> // what's the %@$?
AC> std::auto_ptr<int> x = p; // хорошая дыра, но программист должен знать что так делать нельзя
AC> //printf("%08x,%08x\n",*p,x.get());// надо так наверно ?
printf("%08x,%08x\n",*p, *x.get());
AC> return 0;
AC> }
AC>
AC>#include <memory>
AC>int main()
AC> {
AC> int *p = new int;
AC> *p = 0x123456;
AC> // what's the %@$?
AC> std::auto_ptr<int> x = p; // уже здесь ошибка
Здравствуйте, Bell, Вы писали:
AC>>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>>
Явно не то что должно быть.
B>А код привести так сложно? Или каждый просто обязан иметь VS2005?
Все мы там будем ;(
VS2005 include/memory
template<class _Ty>
struct auto_ptr_ref
{ // proxy reference for auto_ptr copying
auto_ptr_ref(void *_Right)
: _Ref(_Right)
{ // construct from generic pointer to auto_ptr ptr
}
void *_Ref; // generic pointer to auto_ptr ptr
};
//...template<class _Ty>
class auto_ptr
{ // wrap an object pointer to ensure destruction
//...
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // construct by assuming pointer from _Right auto_ptr_ref
_Ty **_Pptr = (_Ty **)_Right._Ref;
_Ty *_Ptr = *_Pptr;
*_Pptr = 0; // release old
_Myptr = _Ptr; // reset this
}
Конструктор от указателя, естестно эксплсит.
B>К вопросу о прямой инициализации и инициализации копированием: B>
B>Comeau:
B>"ComeauTest.c", line 9: error: no suitable constructor exists to convert from
B> "int *" to "std::auto_ptr<int>"
B> std::auto_ptr<int> x = p;
B>
Хм, дык. Это на тему того что берём индустриальный компилер + STL и лёгким движением руки пишем надёжный код.
Был тут как-то подобный топик.
Что-то сдаётся мне некоторые лисепеды понадёжнее будут.
DigitalGuru wrote: > Начнем с того, что gcc это вообще не компилирует:
И VS2003 не компилит, и VS6.... и много кто. А вот флагман компилеростроения, компилит > Правильнее переписать проблемную строку, как: >
> std::auto_ptr<int> x( p );
>
Ну да, только для этого её сначала найти нужно. Задачка тоже себе не чтобы уж фатальная,
но и не тривиальная. Особенно если исходить из тезиса, что STL не содержит ошибок ))
AC>>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>>
AC>> std::auto_ptr<int> x = p; // хорошая дыра, но программист должен знать что так делать нельзя
AC>>
Угу, а ещё он дофига чего должен помнить. А почему собстно? Нормальная себе так очепятка.
И мы же вроде как на компилер скидываем отвественность за выявление того что нельзя? Или нет?
Иначе, ИМХО, нафиг оно такое нужно.
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, korzhik, Вы писали:
AC>>>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>>>
AC>>> std::auto_ptr<int> x = p; // хорошая дыра, но программист должен знать что так делать нельзя
AC>>>
AC>Угу, а ещё он дофига чего должен помнить. А почему собстно? Нормальная себе так очепятка.
Согласен.
AC>И мы же вроде как на компилер скидываем отвественность за выявление того что нельзя? Или нет? AC>Иначе, ИМХО, нафиг оно такое нужно.
В принципе мне твоя позиция уже давно понятна и ясна и в чём то я её разделяю:
нужна эталонная, тщательно оттестированная STL реализация, поставляемая со всеми компиляторами, но так как это невозможно,
то надо очень скептически относится к конкретным реализациям STL, так как их делали люди значит возможны ошибки.
И да и нет. Я не сколько о баге, сколько о проблеме доверия к 'стандартным' либам.
Тут как бы ещё одна дилема возникает.
Что теперь делать? Ничего, и ждать пока ещё кто-нить на это наткнётся (девелоперы очень
разного уровня, да и очипятаться легко можно), или сразу по завершению установки студии
запускать скрипт с патчами? Последнее, ИМХО, нарушает лиценцию MS'а.
Здравствуйте, korzhik, Вы писали:
K>то надо очень скептически относится к конкретным реализациям STL, так как их делали люди значит возможны ошибки.
Конкретно реализацию auto_ptr в VS2005 делали не люди, в смысле не программисты на С++ Когда я "это" увидел — переписал не колеблясь (хотя всегда с трепетом относился к неприкосновенности исходников, идущих в стандартной поставке).
AC>И да и нет. Я не сколько о баге, сколько о проблеме доверия к 'стандартным' либам.
AC>Тут как бы ещё одна дилема возникает. AC>Что теперь делать? Ничего, и ждать пока ещё кто-нить на это наткнётся (девелоперы очень AC>разного уровня, да и очипятаться легко можно), или сразу по завершению установки студии AC>запускать скрипт с патчами? Последнее, ИМХО, нарушает лиценцию MS'а.
А может СТЛ порт использовать ? (я не в курсе, можно ли его использовать с VS 8)
Of course, the code must be complete enough to compile and link.
Здравствуйте, Владик, Вы писали:
В>Здравствуйте, korzhik, Вы писали:
K>>то надо очень скептически относится к конкретным реализациям STL, так как их делали люди значит возможны ошибки.
В>Конкретно реализацию auto_ptr в VS2005 делали не люди, в смысле не программисты на С++ Когда я "это" увидел — переписал не колеблясь (хотя всегда с трепетом относился к неприкосновенности исходников, идущих в стандартной поставке).
а у Microsoft (или Dinkumware) по жизни проблемы с auto_ptr. В VC6.0 у auto_ptr не было метода reset, и не один SP не исправил этой проблемы...
Здравствуйте, Alexey Chen, Вы писали:
AC>Здравствуйте, Bell, Вы писали:
AC>>>Оцените 'юмор' ситуации и если не боитесь поседеть можете заглянуть в сырки STL'я, горячо любимого всеми нами на текщий момент самого модного 2005'ого VS'а.
AC>>>
AC>Собстно что на экране:
AC>C:\Projects>test AC>00000000,00123456
AC>Явно не то что должно быть.
Это почему это?
Вроде по идеологии — самое то: автоптр вступил во владение — отхаппибездил прежнего владельца...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, korzhik, Вы писали:
K>а у Microsoft (или Dinkumware) по жизни проблемы с auto_ptr. В VC6.0 у auto_ptr не было метода reset, и не один SP не исправил этой проблемы...
В VC6 с STL совсем все было плохо и я решил проблему кардинально — использовал STLPort.
Здравствуйте, Alexey Chen, Вы писали:
AC>Хм, дык. Это на тему того что берём индустриальный компилер + STL и лёгким движением руки пишем надёжный код. AC>Был тут как-то подобный топик.
Тут, конечно сложно что-то возразить — баг есть баг.
Возможно, тебя немного успокоит вот это: здесь Типа люди стараются
AC>Что-то сдаётся мне некоторые лисепеды понадёжнее будут.
Мое ИМХО: ключевое слово тут — некоторые