Здравствуйте, Alximik509, Вы писали:
A>В релизе:
A>а тут она прекрастно отрабатывает! ни одного варнинга от компилятора!(хоть бы поругался на меня зараза)
Наконец-то программа с UB, форматирующая жесткий диск, стала реальностью!
char * command = "format c:";
*command = '\0';
system(command);
Здравствуйте, alexeiz, Вы писали:
A>>В релизе:
A>>а тут она прекрастно отрабатывает! ни одного варнинга от компилятора!(хоть бы поругался на меня зараза)
A>Наконец-то программа с UB, форматирующая жесткий диск, стала реальностью!
A>A>char * command = "format c:";
A>*command = '\0';
A>system(command);
A>
Хммм... там-то строчка после записи не использовалась, а тут используется. Почему компилятор будет опускать эту запись? Пробовал запускать?
Здравствуйте, 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);
}
Вообще очень странное поведение
Здравствуйте, Alximik509, Вы писали:
R>>Хммм... там-то строчка после записи не использовалась, а тут используется. Почему компилятор будет опускать эту запись? Пробовал запускать?
R>>
A>Пробовали.. компилятор просто игнорит любое такое присвоение.
Игнорит он в твоём примере, где данные не используются после записи. А тут-то совсем другая ситуация.
A>Более того, он даже игнорит вызовы функций с такими аргументами.
A>Например вот такую функцию он не вызывает.
Я об этом и говорю. Если код не производит никакого видимого поведения, то зачем его генерировать? Тут-то другая ситуация.
Здравствуйте, remark, Вы писали:
R>Я об этом и говорю. Если код не производит никакого видимого поведения, то зачем его генерировать? Тут-то другая ситуация.
R>
не.. даже если так
char * command = "format c:";
*command = '\0';
system(command);
все равно строчку он не будет пытаться менять
Здравствуйте, Alximik509, Вы писали:
A>не.. даже если так
A>A>char * command = "format c:";
A>*command = '\0';
A>system(command);
A>
A>все равно строчку он не будет пытаться менять
Ну тогда одно слово — UB
…про пленение, капитуляцию и нейтралитет строк.
Здравствуйте, 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";
Над чем смеемся ? Над компилятором ?