Re[4]: 1.3.12 - undefined behavior [defns.undefined]
От: Pavel Chikulaev Россия  
Дата: 24.11.05 11:54
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

_>>Если не секрет, что здесь делает std::endl и где конкретно она объявлена?


КЛ>манипулятор потоков, равносилен '\n'

Почти Он еще вызывает std::cout.flush(); А затем возвращает ссылку на std::cout.
КЛ><iostream>
В <ostream> . Т.к. предназначен он лишь для ostreamов. <iostream> включает в себя <ostream>.
Re[5]: 1.3.12 - undefined behavior [defns.undefined]
От: Глеб Алексеев  
Дата: 24.11.05 12:14
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

КЛ>>манипулятор потоков, равносилен '\n'

PC>Почти Он еще вызывает std::cout.flush(); А затем возвращает ссылку на std::cout.
КЛ>><iostream>
PC>В <ostream> . Т.к. предназначен он лишь для ostreamов. <iostream> включает в себя <ostream>.

Где-то в c.l.c++.m пробегало, что <iostream> вовсе не обязан включать <ostream> (в стандарт, как водится, лезть лень). И даже утверждали, что правильный hello world должен начинаться с
#include <iostream>
#include <ostream>
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[6]: 1.3.12 - undefined behavior [defns.undefined]
От: elcste  
Дата: 24.11.05 12:49
Оценка: 8 (1)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Где-то в c.l.c++.m пробегало, что <iostream> вовсе не обязан включать <ostream> (в стандарт, как водится, лезть лень). И даже утверждали, что правильный hello world должен начинаться с

ГА>#include <iostream>
ГА>#include <ostream>

Собственно, решение этой прблемы перенесено на будущее.
Re[3]: 1.3.12 - undefined behavior [defns.undefined]
От: 0xDEADBEEF Ниоткуда  
Дата: 24.11.05 19:40
Оценка:
Здравствуйте, ruslan_abdikeev, Вы писали:

_>Если не секрет, что здесь делает std::endl и где конкретно она объявлена?

RTFS (в смысле, стандарт). Он говорит где.
А вообще, вопрос туппп, -1
__________
16.There is no cause so right that one cannot find a fool following it.
Re[3]: 1.3.12 - undefined behavior [defns.undefined]
От: 0xDEADBEEF Ниоткуда  
Дата: 24.11.05 20:59
Оценка:
Здравствуйте, _Winnie, Вы писали:

>>_W>Кстати, вот яркий пример.

>>Твой пример не отражает "креативного использования" UB.
>>Это просто ошибка в компиляторе. Которая порождает UB.
>Это не пример использования UB. Это обоснование того что и в твоей программе есть UB, раз в компиляторе есть UB,
Оки. Твое утверждение категорично. То есть, оно требует доказательств.

Поэтому, утверждение:
— Undefined Behavior (далее UB) это невозможность предсказать результат выполнения какого-либо выражения в рамках стандарта языка программирования согласно действующему стандарту языка программирования.
— Различные трансляторы и аппаратые платформы могут налагать как расширяющие так и ограничивающие условия на предыдущее утверждение.

Ты же, докажи или опровергни следующее утверждение: В любой программе присутствует UB, если в в любой библиотеке среды исполнения в произвольной функции есть UB.

А также, это утвержение: Оконечная программа с содержит UB, если любая из порождающих ее программ (компилятор, линкер и тд) содержит любую (приводящую к UB или нет) ошибку.

>>Пример в студию!

_W>Доступ:
_W>Эффективность:
Рука зудела написать очень много и очень ядовито, но не буду помогать тебе формализовать проблемыу
Доказывай, Архимед, а то круги твои потрогают
__________
16.There is no cause so right that one cannot find a fool following it.
Re[4]: 1.3.12 - undefined behavior [defns.undefined]
От: _Winnie Россия C++.freerun
Дата: 25.11.05 18:37
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Здравствуйте, _Winnie, Вы писали:


DEA>Ты же, докажи или опровергни следующее утверждение: В любой программе присутствует UB, если в в любой библиотеке среды исполнения в произвольной функции есть UB.


Очень просто: то что входит в часть, входит и в целое

DEA>А также, это утвержение: Оконечная программа с содержит UB, если любая из порождающих ее программ (компилятор, линкер и тд) содержит любую (приводящую к UB или нет) ошибку.


А что тут доказывать?
Предположим, в линкере есть UB. Значит, его поведение неопределено и содержание кучки байт, которую он рожает, не определено.
Ну, значит и поведение этой кучки байт тоже не определено.


>>>Пример в студию!

_W>>Доступ:
_W>>Эффективность:
DEA>Рука зудела написать очень много и очень ядовито, но не буду помогать тебе формализовать проблемыу
DEA>Доказывай, Архимед, а то круги твои потрогают


Ну, сделай мне быстрый квадратный корень без UB и бинарной конверсии в int. Я удивлюсь.
Правда, сейчас для PC это немного устарело, сейчас везде SSE который считает с такой же точностью.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: 1.3.12 - undefined behavior [defns.undefined]
От: Аноним  
Дата: 25.11.05 18:53
Оценка:
Здравствуйте, ruslan_abdikeev, Вы писали:


_>Если не секрет, что здесь делает std::endl и где конкретно она объявлена?


Ну дак извесно где
#include <endl>
Re[4]: 1.3.12 - undefined behavior [defns.undefined]
От: ruslan_abdikeev Россия http://aruslan.nm.ru
Дата: 03.12.05 13:48
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Здравствуйте, ruslan_abdikeev, Вы писали:

_>>Если не секрет, что здесь делает std::endl и где конкретно она объявлена?
DEA>RTFS (в смысле, стандарт). Он говорит где.
DEA>А вообще, вопрос туппп, -1

К сожалению, стандарт как раз этого не говорит, а Вы, к сожалению, — не в теме.
Это был дефект, который решили пока не фиксить: http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-closed.html#343
Товарищ eclste ответил
Автор: elcste
Дата: 24.11.05
на вопрос правильно.

Руслан.
Re: 1.3.12 - undefined behavior [defns.undefined]
От: Аноним  
Дата: 03.12.05 20:52
Оценка:
Здравствуйте, _Winnie :
toALL после прочтения всего этого как бы самому не впасть UB
Re[3]: 1.3.12 - undefined behavior [defns.undefined]
От: Глеб Алексеев  
Дата: 07.12.05 11:34
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Ну хорошо. Объясни мне, почему вот эта HelloWorld программа падает на Visual C++ 7.1 в Release ?

Да уж.
Можно немного минимизировать ее, чтобы не падала, а выдавала различные результаты. НО все равно впечатляет.

#if SHOW_BUG
    char c[4];
    
    c[0]='a';
    c[1]='b';
    c[2]='c';
    c[3]='d';
#else
    char c[4] = {'a', 'b', 'c', 'd'};
#endif
    std::cout << "before: " << c[0] << c[1] << c[2] << c[3] << std::endl;
    
    
    for (int n=2 ; n>0; --n)
    {
        for (int i=0; i<3; i++)
        {
            c[i] = c[i+1];
        }
        c[3] = 'x';
    }
    
    std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;


Что интересно, баг проявляется только тогда, когда массив заполняется присваиванием, вот сгенерированный код для цикла:
    for (int n=2 ; n>0; --n)
00401767  dec         eax  
    {
        for (int i=0; i<3; i++)
        {
            c[i] = c[i+1];
00401768  mov         byte ptr [esp+0Ch],bl 
0040176C  mov         bl,byte ptr [esp+0Eh] 
00401770  mov         byte ptr [esp+0Eh],cl 
00401774  jne         main+67h (401767h) 
        }
        c[3] = 'x';
    }


вывод:
before: abcd
after: cxxx


Если массив проинициализировать, все ОК:
    for (int n=2 ; n>0; --n)
00401770  dec         eax  
    {
        for (int i=0; i<3; i++)
        {
            c[i] = c[i+1];
00401771  mov         dl,byte ptr [esp+0Fh] 
00401775  mov         byte ptr [esp+0Ch],bl 
00401779  mov         bl,byte ptr [esp+0Eh] 
0040177D  mov         byte ptr [esp+0Eh],dl 
        }
        c[3] = 'x';
00401781  mov         byte ptr [esp+0Fh],cl 
00401785  jne         main+70h (401770h) 
    }

вывод:
before: abcd
after: cdxx


Уважаемые гуры, здесь есть какой-то особо сложный случай UB или нет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.