Re[3]: Так и быть.
От: alexeiz  
Дата: 31.03.10 02:51
Оценка: :)
Здравствуйте, Alximik509, Вы писали:

A>В релизе:

A>а тут она прекрастно отрабатывает! ни одного варнинга от компилятора!(хоть бы поругался на меня зараза)

Наконец-то программа с UB, форматирующая жесткий диск, стала реальностью!
char * command = "format c:";
*command = '\0';
system(command);
Re[4]: Так и быть.
От: remark Россия http://www.1024cores.net/
Дата: 31.03.10 05:06
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>>В релизе:

A>>а тут она прекрастно отрабатывает! ни одного варнинга от компилятора!(хоть бы поругался на меня зараза)

A>Наконец-то программа с UB, форматирующая жесткий диск, стала реальностью!

A>
A>char * command = "format c:";
A>*command = '\0';
A>system(command);
A>


Хммм... там-то строчка после записи не использовалась, а тут используется. Почему компилятор будет опускать эту запись? Пробовал запускать?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: Так и быть.
От: Alximik509 Россия  
Дата: 31.03.10 08:06
Оценка:
Здравствуйте, remark, Вы писали:

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


A>>>В релизе:

A>>>а тут она прекрастно отрабатывает! ни одного варнинга от компилятора!(хоть бы поругался на меня зараза)

A>>Наконец-то программа с UB, форматирующая жесткий диск, стала реальностью!

A>>
A>>char * command = "format c:";
A>>*command = '\0';
A>>system(command);
A>>


R>Хммм... там-то строчка после записи не использовалась, а тут используется. Почему компилятор будет опускать эту запись? Пробовал запускать?


R>


Пробовали.. компилятор просто игнорит любое такое присвоение.
Более того, он даже игнорит вызовы функций с такими аргументами.

Например вот такую функцию он не вызывает.

void foo(char *p)
{    
    for(int i=0 ;i < 10; i++)
    {
    
        *p = '0';
        p++;
    }
    *p = '\0';
}


А вот если так. то вызывает. и получаем ошибку в рантайме

void foo(char *p)
{    
    for(int i=0 ;i < 10; i++)
    {
    
        *p = '0';
        p++;
    }
    *p = '\0';
    printf("%s", p);
}


Вообще очень странное поведение
Re[6]: Так и быть.
От: remark Россия http://www.1024cores.net/
Дата: 31.03.10 08:10
Оценка:
Здравствуйте, Alximik509, Вы писали:

R>>Хммм... там-то строчка после записи не использовалась, а тут используется. Почему компилятор будет опускать эту запись? Пробовал запускать?


R>>


A>Пробовали.. компилятор просто игнорит любое такое присвоение.


Игнорит он в твоём примере, где данные не используются после записи. А тут-то совсем другая ситуация.

A>Более того, он даже игнорит вызовы функций с такими аргументами.


A>Например вот такую функцию он не вызывает.


Я об этом и говорю. Если код не производит никакого видимого поведения, то зачем его генерировать? Тут-то другая ситуация.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: Так и быть.
От: Alximik509 Россия  
Дата: 31.03.10 09:08
Оценка:
Здравствуйте, remark, Вы писали:

R>Я об этом и говорю. Если код не производит никакого видимого поведения, то зачем его генерировать? Тут-то другая ситуация.


R>


не.. даже если так

char * command = "format c:";
*command = '\0';
system(command);


все равно строчку он не будет пытаться менять
Re[8]: Так и быть.
От: remark Россия http://www.1024cores.net/
Дата: 31.03.10 09:16
Оценка:
Здравствуйте, Alximik509, Вы писали:

A>не.. даже если так


A>
A>char * command = "format c:";
A>*command = '\0';
A>system(command);
A>


A>все равно строчку он не будет пытаться менять


Ну тогда одно слово — UB


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Кстати, хочу также темы
От: achp  
Дата: 31.03.10 11:10
Оценка: :)
…про пленение, капитуляцию и нейтралитет строк.
Re[2]: Так и быть.
От: Pavel Dvorkin Россия  
Дата: 02.04.10 13:37
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Ну когда ты несколько строчек заводишь, большинство компиляторов пытаются сэкономить и если строчки совпадают начинают их переиспользовать. Так что когда ты напишешь
char *p2 = "hello";
компилятор нового места в сегменте статических данных не заведёт, а переиспользует старое.


/GF (Eliminate Duplicate Strings)
See Also Send Feedback

Enables the compiler to create a single copy of identical strings in the program image and in memory during execution, resulting in smaller programs, an optimization called string pooling.

/GF

Remarks
/GF pools strings as read-only.

If you use /GF, the operating system does not swap the string portion of memory and can read the strings back from the image file. If you try to modify strings under /GF, an application error occurs.

String pooling allows what were intended as multiple pointers to multiple buffers to be as multiple pointers to a single buffer. In the following code, s and t are initialized with the same string. String pooling causes them to point to the same memory:

Copy Code
char *s = "This is a character buffer";
char *t = "This is a character buffer";
With best regards
Pavel Dvorkin
Re[3]: 2 Egor
От: Pavel Dvorkin Россия  
Дата: 02.04.10 16:52
Оценка:
Над чем смеемся ? Над компилятором ?
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.