2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4
 
 Re: struct S* x;
Сообщение08.11.2021, 12:21 
Заслуженный участник
Аватара пользователя


16/07/14
8449
Цюрих
realeugene в сообщении #1538194 писал(а):
1. Не знаю, в чём именно человек пишет, но может быть стоит посоветовать ему запустить его разумеется кривую программу под отладчиком без оптимизации и пройти её пошагово? Или отладчики уже запрещены?
Отладчики ничего не гарантируют. Если в программе есть UB, то результат может зависеть от версии компилятора, текущего времени и погоды на Марсе.
realeugene в сообщении #1538194 писал(а):
2. Да ладно! Процесс сам закрывает все потоки у сбррасывает буфера при нормальном завершении.
Да, но вот оказывается что сброс буфера не гарантирует, что не заканчивающаяся символом новой строки строка будет выведена (я тоже этого не знал).
realeugene в сообщении #1538194 писал(а):
При ненормальном тоже что-то должно быть написано системой в консоль, про то, что процесс умер.
Это уже вопрос к системе, а не к программе. Кроме того, никто не гарантирует, что программа с UB завершается с ошибкой, а не форматирует диск после чего завершается с кодом 0.
realeugene в сообщении #1538194 писал(а):
3. Да ладно! Память под процесс выделяется системой при его создании.
А malloc, видимо, ничего не делает.
Какая-то память выделяется автоматически при запуске, но произвольный указатель (если бы мы записали в S0.x какой-то мусор, а не оставили неинициализированным) не обязан смотреть на существующую память.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 01:02 
Аватара пользователя


28/10/21
99
realeugene в сообщении #1538194 писал(а):
Exterminate!

1. Не знаю, в чём именно человек пишет, но может быть стоит посоветовать ему запустить его разумеется кривую программу под отладчиком без оптимизации и пройти её пошагово? Или отладчики уже запрещены?


Разглядывание неопределенного поведения в пошаговом отладчике??? Разбирающемуся в теме человеку может быть полезно в ряде случаев, но вот начинающему такое разглядывание лишь набьет голову бессмысленными домыслами из разряда "безногий таракан не слышит", как в старом анекдоте.

realeugene в сообщении #1538194 писал(а):
2. Да ладно! Процесс сам закрывает все потоки у сбррасывает буфера при нормальном завершении. При ненормальном тоже что-то должно быть написано системой в консоль, про то, что процесс умер.


Не совсем понимаю, при чем здесь нормальное завершение, если речь идет именно о ненормальном. И что именно вы хотели добавить к обсуждению своим заявлением о "тоже что-то должно быть написано системой в консоль". Да, что-то будет записано. Правда, обычно не в stdout, а в stderr, то есть понять смысл изначального утверждения о "ничего не выводит" труда не составляет.

realeugene в сообщении #1538194 писал(а):
3. Да ладно! Память под процесс выделяется системой при его создании.


Не ясно, что тут вообще хотели сказать. Неинициализированное значение указателя запросто может указывать в тот регион виртуального адресного пространства процесса, для которого никакой "памяти" пока не создано.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 11:36 


27/08/16
9426
mihaild в сообщении #1538207 писал(а):
Отладчики ничего не гарантируют. Если в программе есть UB, то результат может зависеть от версии компилятора, текущего времени и погоды на Марсе.
Гарантирует только Госстрах. Отладчики для того и существуют, чтобы помогать разбираться с ошибками программистов, простимулированными разными гадостями шибко умных оптимизирующих компиляторов. Как и отладочные режимы в компиляторах.

Программисты-теоретики, блин. ТС ещё в кубики играется, а вы его UB грузите, называя неопределённым поведением вполне закономерное падение процесса. Формально - конечно, "вы находитесь на воздушном шаре".

mihaild в сообщении #1538207 писал(а):
Да, но вот оказывается что сброс буфера не гарантирует, что не заканчивающаяся символом новой строки строка будет выведена (я тоже этого не знал).
Всякая дрянь бывает. Вы, действитель, думаете, что ТС собирает свой Hello world на какой-нибудь системе с выводом на перфокарты?

mihaild в сообщении #1538207 писал(а):
Это уже вопрос к системе, а не к программе. Кроме того, никто не гарантирует, что программа с UB завершается с ошибкой, а не форматирует диск после чего завершается с кодом 0.
Нельзя рассматривать программу в отрыве от системы, на которой она выполняется. У ТС скорее всего OS выводит сообщение о падении, а не взрывает атомную бомбу.

mihaild в сообщении #1538207 писал(а):
А malloc, видимо, ничего не делает.
Какая-то память выделяется автоматически при запуске, но произвольный указатель (если бы мы записали в S0.x какой-то мусор, а не оставили неинициализированным) не обязан смотреть на существующую память.
maloc выделяет память из заранее созданной кучи. Нет кучи - нет маллока. Такое тоже бывает, хоть в плюсах и редко. Кроме того, что такое "выделенная память" на системах с виртуальной памятью имеет множество нюансов. Как минимум, адресное пространство процесса уже создано.

TheRuinedMap в сообщении #1538307 писал(а):
Разглядывание неопределенного поведения в пошаговом отладчике??? Разбирающемуся в теме человеку может быть полезно в ряде случаев, но вот начинающему такое разглядывание лишь набьет голову бессмысленными домыслами из разряда "безногий таракан не слышит", как в старом анекдоте.
Да, именно! Отключить оптимизацию и ходить по строчкам пошагово. Чтобы увидеть, в каком именно месте падает, хотя бы. Особенно, начинающему. Забив на то, что отключение оптимизации тоже не прописано в стандарте (кажется). Exterminate этот комитет по стандартизации, довёдший плюсы до состояния PL/1!

TheRuinedMap в сообщении #1538307 писал(а):
Не совсем понимаю, при чем здесь нормальное завершение, если речь идет именно о ненормальном. И что именно вы хотели добавить к обсуждению своим заявлением о "тоже что-то должно быть написано системой в консоль". Да, что-то будет записано. Правда, обычно не в stdout, а в stderr, то есть понять смысл изначального утверждения о "ничего не выводит" труда не составляет.
Вы сами уже запутались. В данном месте вы утверждали именно про нормальное завершение процесса. Мол, он имеет право не выводить при нормальном завершении последнюю строку, которая не завершена переводом строки. Ракссматривая какую-то экзотические процессы в вакууме, а вовсе не нужды TC. Да и sdterr на этом уровне изучения языка всегда та же консоль.

TheRuinedMap в сообщении #1538307 писал(а):
Не ясно, что тут вообще хотели сказать. Неинициализированное значение указателя запросто может указывать в тот регион виртуального адресного пространства процесса, для которого никакой "памяти" пока не создано.
Может указывать, может не указывать. Я говорил, что утверждение про память было настолько общо, что некорректно.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 11:58 
Заслуженный участник
Аватара пользователя


16/07/14
8449
Цюрих
realeugene в сообщении #1538347 писал(а):
Отладчики для того и существуют, чтобы помогать разбираться с ошибками программистов
Да.
realeugene в сообщении #1538347 писал(а):
простимулированными разными гадостями шибко умных оптимизирующих компиляторов
Нет.

Отладчик очень полезен, если программа корректна, но делает не то, что нужно, и иногда помогает найти ошибку в некорректной программе. Пониманию, что происходит в некорректном коде "на самом деле" они не помогают, потому что нет никакого "самого дела". Чем раньше человек, пишущий на С или С++ поймет, что для рассуждений о корректности нельзя думать о реальном железе, тем лучше.

Тут уж скорее стоит посоветовать address sanitizer, который имеет хоть какие-то шансы сказать, что в коде неправильно в смысле абстрактной машины.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 12:39 


27/08/16
9426
mihaild в сообщении #1538349 писал(а):
Отладчик очень полезен, если программа корректна, но делает не то, что нужно, и иногда помогает найти ошибку в некорректной программе. Пониманию, что происходит в некорректном коде "на самом деле" они не помогают, потому что нет никакого "самого дела".
Вам никогда при ручной оптимизации кода не приходилось учитывать длину кэш-линии?

Программирование - это инженерная область деятельности. "Правильно" то, что приводит к требуемому результату. Иногда и подпирание спичками необходимо. По моим наблюдениям, непонимание того, во что именно компилятор превращает написанноый код, приводит к плачевным результатам. Почему именно он это себе позволяет - это уже следующий уровень понимания языка. В котором и появляется UB.

-- 09.11.2021, 12:46 --

mihaild в сообщении #1538349 писал(а):
Тут уж скорее стоит посоветовать address sanitizer, который имеет хоть какие-то шансы сказать, что в коде неправильно в смысле абстрактной машины.
В отладочном режиме компиляторы давно умеют сами забивать все неициализированные переменные каким-нибудь мёртвым мясом. И все подобные указатели отладчиком ловятся при первой же попытке их разыменовать.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 12:48 
Заблокирован


19/02/13

2388
mihaild в сообщении #1538349 писал(а):
для рассуждений о корректности нельзя думать о реальном железе


Почему? Ведь программа в итоге на реальном железе и выполняется.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 13:05 
Заслуженный участник
Аватара пользователя


16/07/14
8449
Цюрих
realeugene в сообщении #1538356 писал(а):
Вам никогда при ручной оптимизации кода не приходилось учитывать длину кэш-линии?
Я же написал "о корректности", а не "о производительности". И мне приходилось сталкиваться с ситуациями, когда хитрые ручные оптимизации под конкретное железо после смены компилятора переставали работать.
realeugene в сообщении #1538356 писал(а):
По моим наблюдениям, непонимание того, во что именно компилятор превращает написанноый код, приводит к плачевным результатам
А по моим наблюдениям к плачевным результатам гораздо чаще приводят как раз идеи "я понимаю, какой тут на самом деле получится ассемблер, знаю как на самом деле происходит переполнение знаковых чисел и как лежит union, поэтому тут всё работать будет". Заканчивающиеся, естественно, тем, что новая версия компилятора обнаруживает всё это, радостно выкидывает половину кода и получается совсем непонятно что.
Vladimir-80 в сообщении #1538358 писал(а):
Почему? Ведь программа в итоге на реальном железе и выполняется
Потому что во что превратится некорректная программа на реальном железе - предсказать нельзя.

 Профиль  
                  
 
 Re: struct S* x;
Сообщение09.11.2021, 14:19 


27/08/16
9426
mihaild в сообщении #1538362 писал(а):
Я же написал "о корректности", а не "о производительности". И мне приходилось сталкиваться с ситуациями, когда хитрые ручные оптимизации под конкретное железо после смены компилятора переставали работать.
Да, разумеется. Только к этому моменту уже успешно проданы миллионы копий хорошо работающего на старом компиляторе кода.

-- 09.11.2021, 14:20 --

mihaild в сообщении #1538362 писал(а):
Заканчивающиеся, естественно, тем, что новая версия компилятора обнаруживает всё это, радостно выкидывает половину кода и получается совсем непонятно что.
Новая версия, реализованная в соответствии с новой версией стандарта языка.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3, 4

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group