- 
	- В функции   RxTx(554 знак., 08.12.2019 00:29)
			- Что за ересь?! С чего бы у меня был использован один и  тот же буфер?..  POV_(70 знак., 08.12.2019 11:49,  ) )
- "buffer у тебя глобальная переменная" - Где? - VLLV(08.12.2019 08:23)
					- POV_ код ниже приводил. - RxTx(09.12.2019 14:16)
 
- Беда, коль пироги начнет печи сапожник, Ruslan(290 знак., 08.12.2019 07:31)
- спасибо! ТС так и вылечил -> - Evgeny_CD(08.12.2019 00:46, ссылка)
					- Мне показалось он "вылечил", а сделал перестановку кроватей.  ;-) - RxTx(08.12.2019 00:56)
							- Мне кажется, что суть этого важного глюка до нас еще толком не дошла.  Evgeny_CD(82 знак., 08.12.2019 01:51)
									- "Важный глюк" - фантазия. "Многопоточность может случиться в однопоточной системе" - заблужение. "Очень поучительно" - фантазия. Молодец, возьми с полки пирожок. - SciFi(08.12.2019 11:20)
											- Нет ли тут интересного...  POV_(73 знак., 09.12.2019 11:53,  ) )- Вызов вложенной функции - всего лишь несколько байт стека. - VLLV(09.12.2019 12:16)
															- А вызов одной и той же функции в иерархии вызовов несколько раз - многопоточность в однопоточном приложении. И если эта функция не реентерабельна, то вылет. - Evgeny_CD(09.12.2019 14:12)
																	- Ну ты же понял что там происходит. sprintf() ожидает что её %s параметр (его char* буфер) имеет ожидаемую ей длину.     RxTx(655 знак., 09.12.2019 16:10)
																			- Ты как "баба - сам придумал, сам - обиделся". Нет никакой печати в тот же буфер! Глаза промой наконец. - POV_(09.12.2019 17:02,  ) )- Ты покажи весь код и полностью. А не набрасывай на вентилятор по кусочкам. Очевидно, что у тебя ошибка (мол gcc настолько кривая паделка, что ты гениальный программист сразу вляпался -- слишком сомнительно, там ошибки обычно сильно другого плана),  fk0(626 знак., 09.12.2019 23:44)
																							- Языком СИ написано (см. ссыль в теле). Где там общий буфер?...  POV_(222 знак., 09.12.2019 23:50,  ) )- В psu_GetField(psuNOMINAL_VOUT) буфер аргументом не передается стало быть он внутри общий про что вам и пишут. Помещайте полный исходник или его тестовый эквивалент где проявляется баг если полный нельзя. - 3m(10.12.2019 10:40)
																											- Не надо просто придумывать. Исходные данные - всё работало. Т.е. никакого одного буфера нет. Похер как оно внутри psu_GetField. - POV_(10.12.2019 12:53,  ) )
- Но они вызываются последовательно. - VLLV(10.12.2019 10:48)
																													- "порядок вычисления аргументов функции в языке c/c++ строго не определен" - 3m(10.12.2019 10:57)
																															- ОК, не последовательно, пусть в инверсном порядке, но ведь не все одновременно? - VLLV(10.12.2019 11:06)
 
 
- "порядок вычисления аргументов функции в языке c/c++ строго не определен" - 3m(10.12.2019 10:57)
																															
 
- Не надо просто придумывать. Исходные данные - всё работало. Т.е. никакого одного буфера нет. Похер как оно внутри psu_GetField. - POV_(10.12.2019 12:53, 
- Имеет место баг спрятанный под коврик. Не надо думать, что ты такой уникум со своей игрушечной программкой, что раз и баг нашёл. Мог конечно, но это примерно как выиграть в лотерею. Нужно очень много играть, проект с миллионом строк, например. Не  fk0(400 знак., 09.12.2019 23:58)
																											- В проекте с миллионом строк , сотней больше ошибок сотней меньше , рабочий процесс. PlainUser(58 знак., 11.12.2019 11:44)
- Ты чего дурака-то включаешь? Я ж ясно тут отписался уже..  POV_(622 знак., 10.12.2019 08:56,  ) )- Дохтур, у меня в глазах постоянно темнеет... Ну что вы мне пульс меряете... Вы мне зрение проверьте!!! - il-2(10.12.2019 11:14)
- Дурака включаешь ты и реально не догоняешь даже. Смотри, вариант 1:   fk0(1456 знак., 10.12.2019 11:10)
																															- И чего я не так сказал? - POV_(10.12.2019 12:55,  ) )
 
- И чего я не так сказал? - POV_(10.12.2019 12:55, 
- "В сишнике все переменные выносятся в начло функции где бы ты их не объявил". Что это было? О_о. Мне кажется, в твоих представлениях о сишнике имеются заблуждения. - SciFi(10.12.2019 09:47)
 
 
 
- В psu_GetField(psuNOMINAL_VOUT) буфер аргументом не передается стало быть он внутри общий про что вам и пишут. Помещайте полный исходник или его тестовый эквивалент где проявляется баг если полный нельзя. - 3m(10.12.2019 10:40)
																											
 
- Языком СИ написано (см. ссыль в теле). Где там общий буфер?...  POV_(222 знак., 09.12.2019 23:50, 
 
- Ты покажи весь код и полностью. А не набрасывай на вентилятор по кусочкам. Очевидно, что у тебя ошибка (мол gcc настолько кривая паделка, что ты гениальный программист сразу вляпался -- слишком сомнительно, там ошибки обычно сильно другого плана),  fk0(626 знак., 09.12.2019 23:44)
																							
 
- Ты как "баба - сам придумал, сам - обиделся". Нет никакой печати в тот же буфер! Глаза промой наконец. - POV_(09.12.2019 17:02, 
- Вы все обкуренные и не лечитесь. Невозможно устроить рекурсивный вызов sprintf(). По буквам: николай, елена, владимир, олег, зинаида, михаил, ольга, жозефина, нина, оксана. Как этот простой факт ускользает от здешней публики - для меня загадка. - SciFi(09.12.2019 14:17)
																			- Пока туда не влезет оптимизатор. - Boвa(09.12.2019 17:22)
																					- Куда? В stdio? - VLLV(09.12.2019 18:17)
 
- +++ - Гудвин(09.12.2019 17:07)
- Мной выше говорилось только о ситуации по ссылке, не нужно обобщать. - VLLV(09.12.2019 14:50)
 
- Пока туда не влезет оптимизатор. - Boвa(09.12.2019 17:22)
																					
 
- Ну ты же понял что там происходит. sprintf() ожидает что её %s параметр (его char* буфер) имеет ожидаемую ей длину.     RxTx(655 знак., 09.12.2019 16:10)
																			
 
- А вызов одной и той же функции в иерархии вызовов несколько раз - многопоточность в однопоточном приложении. И если эта функция не реентерабельна, то вылет. - Evgeny_CD(09.12.2019 14:12)
																	
 
- Вызов вложенной функции - всего лишь несколько байт стека. - VLLV(09.12.2019 12:16)
															
 
- Нет ли тут интересного...  POV_(73 знак., 09.12.2019 11:53, 
 
- "Важный глюк" - фантазия. "Многопоточность может случиться в однопоточной системе" - заблужение. "Очень поучительно" - фантазия. Молодец, возьми с полки пирожок. - SciFi(08.12.2019 11:20)
											
 
- Мне кажется, что суть этого важного глюка до нас еще толком не дошла.  Evgeny_CD(82 знак., 08.12.2019 01:51)
									
 
- Мне показалось он "вылечил", а сделал перестановку кроватей.  ;-) - RxTx(08.12.2019 00:56)
							
 
- Что за ересь?! С чего бы у меня был использован один и  тот же буфер?..  POV_(70 знак., 08.12.2019 11:49, 
- попробуйте выровнять буфер на 8 байт(aligned(8)). Было что то подобное. - Mikla(06.12.2019 17:46)
- Когда я вижу без ошибок написанную нереентрантную функцию, на которую жалуются "что-то странно она себя ведет", то сразу возникает вопрос: откуда она у тебя вызывается? Если из разных потоков и обработчиков - то буратино найден :-) - il-2(06.12.2019 14:30)
- Может, не в тему. Всегда (если в библиотеке есть) вместо sprintf использую snprintf. От переполнений стека, правда, это не спасает. - Сидоргек(06.12.2019 11:26)
- sprintf может валить прогу, если 1) аргументы не соответствуют строке формата (в частности опасно использование "%n"), 2) нижележащие функции, через которые printf (без s) печатает, вызывают ошибку, 3) если это sprintf и переполняется буфер...  fk0(2051 знак., 06.12.2019 10:50)
			- Зачетно , местами гениально! - PlainUser(09.12.2019 15:25)
- +100500 за valgrind. При компиляции в режиме отладки утилита показывает стек вызовов с именами функций и номерами строк. Уйму блох отловил этим полезным инструментом. - =AlexD=(06.12.2019 11:58)
- Варнинги проверял, snprintf пробовал, строку подставлял фиксированную без параметров. Валится всегда в одном и том же месте. Ниже я описал где...  POV_(23 знак., 06.12.2019 11:41,  ) )
- Спасибо! Душевно. - Evgeny_CD(06.12.2019 11:06)
- Вдогонку, в embedded ещё встречаются проблемы с распечаткой чисел с плавающей точкой -- в процессоре может не быть fpu, а в библиотеке используется, или наоборот и разный ABI (call convention), если библиотеки какие-то экзотические, то могут плохо  fk0(34 знак., 06.12.2019 10:54)
					- Плавучку не использую. Валится как раз на моей функции, которая из float печатает число используя %d. - POV_(06.12.2019 11:42,  ) )- ЕМНИП, в GCC при нулевой оптимизации по дефолту -fno-strict-aliasing, а при остальных - наоборот - -fstrict-aliasing - Vit(09.12.2019 21:42)
- "Плавучку не" не противоречит "из float печатает" ? - VLLV(06.12.2019 11:48)
									- Не использую плавучку в sprintf - POV_(06.12.2019 11:53,  ) )- я float перед sprintf всегда превращаю в целое (зная где у меня там запятая стоит). И всё нормально - Лагунов(06.12.2019 12:46)
													- Да это-то тут причем?...  POV_(740 знак., 06.12.2019 13:40,  ) )- 1) заменяли только первый sprintf ? или все четыре sprintf на sprintf(this_buf, "blyat!")  sprintf(this_buf, "blyat 2!") sprintf(this_buf, "blyat 3!") sprintf(this_buf, "blyat 4!"). ?  Zoro(257 знак., 06.12.2019 14:06)
																	- Да, пофиг на (int)f. Я туда и чисто инт без преобразования подставлял. - POV_(06.12.2019 14:13,  ) )
 
- Да, пофиг на (int)f. Я туда и чисто инт без преобразования подставлял. - POV_(06.12.2019 14:13, 
- Может еще в линкерном скрипте какая то лажа, наезд на неиспользуемую область и твое "blyat!" оказывается там где царство вечной неопределенности. - ASDFS(06.12.2019 13:45)
 
- 1) заменяли только первый sprintf ? или все четыре sprintf на sprintf(this_buf, "blyat!")  sprintf(this_buf, "blyat 2!") sprintf(this_buf, "blyat 3!") sprintf(this_buf, "blyat 4!"). ?  Zoro(257 знак., 06.12.2019 14:06)
																	
 
- Да это-то тут причем?...  POV_(740 знак., 06.12.2019 13:40, 
 
- я float перед sprintf всегда превращаю в целое (зная где у меня там запятая стоит). И всё нормально - Лагунов(06.12.2019 12:46)
													
 
- Не использую плавучку в sprintf - POV_(06.12.2019 11:53, 
 
 
- Плавучку не использую. Валится как раз на моей функции, которая из float печатает число используя %d. - POV_(06.12.2019 11:42, 
 
- Опытные товарищи берут в зубы отладчик и ищут косяк. - SciFi(06.12.2019 09:46)
			- Так оно уходит в никуда при пошаговой работе. Соседние строчки с тем же sprintf норм работают. - POV_(06.12.2019 09:49,  ) )- Чехарда в адресной арифметике ? К примеру: Есть массив из 10 элементов, а делается запись в 11-ый. Результат: затёрта память в соседней переменой. "Чудный" результат. Был обнаружен при смене компилятора (или по другому выполнял линковку). - Zoro(06.12.2019 10:42)
							- Не, такого что нет. А вот что есть...  POV_(228 знак., 06.12.2019 11:39,  ) )- default может добавить? в Винавр помогало。 - Symbions(06.12.2019 13:24)
											- бубен эффективнее - SciFi(06.12.2019 13:31)
													- Нет, но не помешает попробовать  Symbions(35 знак., 06.12.2019 17:47 - 17:49)
															- Не нашёл, а спрятал. SciFi(50 знак., 06.12.2019 17:50, ссылка)
 
 
- Нет, но не помешает попробовать  Symbions(35 знак., 06.12.2019 17:47 - 17:49)
															
 
- бубен эффективнее - SciFi(06.12.2019 13:31)
													
- В дизассемблере по шагам пройдись. Указатель стека проверь. - SciFi(06.12.2019 11:48)
											- В общем сам "дурак", дал шанс компилятору при оптимизации повертеть меня на херу...  POV_(534 знак., 06.12.2019 15:11,  ) )- Основной вопрос в этом коде - это где хранится результат внутренних sprintf после возвращения из функции psu_GetField. Ведь переменным bb присваиваются указатели на некий буфер. Если это глобальный буфер, то последовательные вызовы psu_GetField  PSP(148 знак., 08.12.2019 20:28)
															- Там всё в порядке - POV_(08.12.2019 21:40,  ) )
 
- Там всё в порядке - POV_(08.12.2019 21:40, 
- Проблема при вложенности функций указывает в первую очередь на проблему со стеком. - VLLV(07.12.2019 05:00)
															- про вложенность --> - SciFi(07.12.2019 13:44, ссылка)
																	- Автор пишет черным по черному: "Внутри psu_GetField есть свой sprintf, а то и два" - VLLV(07.12.2019 14:58)
																			- Предлагаю подумать на тему "как в рамках одного потока осуществить вложенный вызов sprintf?"  SciFi(35 знак., 07.12.2019 15:33)
																					- С одной стороны - торможу, земляные работы отбили разум. А с другой стороны ... ну неужели расход стека не зависит от действий программиста? - VLLV(07.12.2019 16:02)
																							- Зависит. Он и от настроек оптимизации зависит. Но поциент упорно игнорирует этот факт. Кто ж ему дохтур? - SciFi(07.12.2019 16:35)
																									- Да ничего я не игнорирую. Я ж не говорю "гцц косячит". Просто крайне редко сталкивался с зависимостью работы компилятора от космических флуктуаций. - POV_(07.12.2019 16:39,  ) )- Современные оптимизирующие компиляторы -- коварны. Они могут видеть, что ты написал какую-то лажу. Понимать это, по своему, мол код всё равно не работает, и нагенерировать в итоге что-то другое. При этом ни слова не скажут. Видеть могут глубоко,  fk0(41 знак., 09.12.2019 23:52)
																													- Оптимист. Ежели -flto, то видят вообще всё. - SciFi(10.12.2019 00:09)
 
- Я сталкивался. Потом находил косяки в своём коде. Например, что-то где-то гадит в чужие переменные. Через косячную адресную арифметику или ещё как-то. Всего и не упомню. - SciFi(07.12.2019 16:41)
 
- Современные оптимизирующие компиляторы -- коварны. Они могут видеть, что ты написал какую-то лажу. Понимать это, по своему, мол код всё равно не работает, и нагенерировать в итоге что-то другое. При этом ни слова не скажут. Видеть могут глубоко,  fk0(41 знак., 09.12.2019 23:52)
																													
 
- Да ничего я не игнорирую. Я ж не говорю "гцц косячит". Просто крайне редко сталкивался с зависимостью работы компилятора от космических флуктуаций. - POV_(07.12.2019 16:39, 
 
- Зависит. Он и от настроек оптимизации зависит. Но поциент упорно игнорирует этот факт. Кто ж ему дохтур? - SciFi(07.12.2019 16:35)
																									
 
- С одной стороны - торможу, земляные работы отбили разум. А с другой стороны ... ну неужели расход стека не зависит от действий программиста? - VLLV(07.12.2019 16:02)
																							
 
- Предлагаю подумать на тему "как в рамках одного потока осуществить вложенный вызов sprintf?"  SciFi(35 знак., 07.12.2019 15:33)
																					
 
- Автор пишет черным по черному: "Внутри psu_GetField есть свой sprintf, а то и два" - VLLV(07.12.2019 14:58)
																			
 
- про вложенность --> - SciFi(07.12.2019 13:44, ссылка)
																	
- А внутри psu_GetField, когда вызывается sprintf, он печатает случайно не в ту же статическую переменную, в которую печать происходит в той функции, где глюки были обнаружены?  Тогда чего же ты хочешь?  snprintf начинает читать из буфера и  fk0(771 знак., 06.12.2019 20:21)
															- есть у меня подозрения, что либа со спринтфом настолько "однопоточная", что там даже просто для sprintfa используется какая-нить static переменная, в которой, например, хранится счётчик выведенных байт. в итоге при вложении спринтфов вложеннные  Mahagam(128 знак., 07.12.2019 12:36)
																	- Где там вложенность? sprintf вызывается последовательно жи. Как вообще организовать "вложенный вызов sprintf" в одном потоке? Хочу всё знать. - SciFi(07.12.2019 12:46)
																			- читайте внимательно что пишет ТС, там как раз есть вложенность - Mahagam(07.12.2019 12:58, ссылка)
 
 
- Где там вложенность? sprintf вызывается последовательно жи. Как вообще организовать "вложенный вызов sprintf" в одном потоке? Хочу всё знать. - SciFi(07.12.2019 12:46)
																			
- Нет, там массив "строк". А именно 5 штук. И вызывается не более 3 за раз...  POV_(115 знак., 07.12.2019 02:05,  ) )
- Но почему при присваивании возвращаемых psu_GetField значений временным переменным эффект пропал? Хотя вопрос, откуда psu_GetField берёт буфер для sprintf, весьма уместен. - йцукен(06.12.2019 22:07)
																	- А что буфер? Выполнение последовательное, никто никому не мешает. Выдумки, короче. - SciFi(06.12.2019 22:20)
																			- Может и выдумки, но поскольку я в чудеса не верю, должно быть материальное объяснение. Вынеся вызовы psu_GetField из вызова sprintf в отдельные строчки, ТС (возможно) изменил порядок, в котором следуют эти вызовы. Поскольку внутренности йцукен(100 знак., 06.12.2019 23:31)
- Содержимое буфера передаётся в printf не по значению, а по ссылке. В итоге когда функция печатает в тот же буфер, который является одним из аргументов -- аргумент рискует стать бесконечным. Там конечно начинаются ньюансы. Считает ли sprintf внутри fk0(394 знак., 06.12.2019 22:34 - 22:38, ссылка)
 
 
- А что буфер? Выполнение последовательное, никто никому не мешает. Выдумки, короче. - SciFi(06.12.2019 22:20)
																			
 
- есть у меня подозрения, что либа со спринтфом настолько "однопоточная", что там даже просто для sprintfa используется какая-нить static переменная, в которой, например, хранится счётчик выведенных байт. в итоге при вложении спринтфов вложеннные  Mahagam(128 знак., 07.12.2019 12:36)
																	
- Может и туплю, но как именно это объясняет глюки? - SciFi(06.12.2019 15:19)
															- Ну он как-то наоптимизировал одинаковые куски кода...  POV_(205 знак., 06.12.2019 15:28,  ) )- Приговор такой: вменяемое объяснение не найдено, багу удалось временно замести под ковёр, потом вылезет в другом месте. - SciFi(06.12.2019 15:36)
																			- Ну это да.. - POV_(06.12.2019 17:25,  ) )
 
- Ну это да.. - POV_(06.12.2019 17:25, 
 
- Приговор такой: вменяемое объяснение не найдено, багу удалось временно замести под ковёр, потом вылезет в другом месте. - SciFi(06.12.2019 15:36)
																			
 
- Ну он как-то наоптимизировал одинаковые куски кода...  POV_(205 знак., 06.12.2019 15:28, 
 
- Основной вопрос в этом коде - это где хранится результат внутренних sprintf после возвращения из функции psu_GetField. Ведь переменным bb присваиваются указатели на некий буфер. Если это глобальный буфер, то последовательные вызовы psu_GetField  PSP(148 знак., 08.12.2019 20:28)
															
- Это уж в понедельник. Пройдусь по асму. - POV_(06.12.2019 13:34,  ) )
- а мне тут говорили, как крут gcc, все предупреждения. Ни фига он не умеет против погроммиста) - VLLV(06.12.2019 11:55)
- Придется, но ассемблер егойный не знаю, читать придется. - POV_(06.12.2019 11:54,  ) )- Ассемблера испугался. Найди в тырнете чит-лист на одну страницу, повесь перед носом. Ничего особенного там нет. - SciFi(06.12.2019 12:06)
- Да хрен с ним, ассемблером, вначале стек. Дерево вызовов, указатель, локальные переменные... Переместить этот свич в другое место, там работает? - VLLV(06.12.2019 12:00)
 
 
- В общем сам "дурак", дал шанс компилятору при оптимизации повертеть меня на херу...  POV_(534 знак., 06.12.2019 15:11, 
 
- default может добавить? в Винавр помогало。 - Symbions(06.12.2019 13:24)
											
- Это частный случай "неопределённого поведения". В таких случаях gcc временами делает такое, что глаза на лоб лезут. А что? Имеет право. - SciFi(06.12.2019 10:48)
 
- Не, такого что нет. А вот что есть...  POV_(228 знак., 06.12.2019 11:39, 
- Такая ерунда не может остановить опытных товарищей. - SciFi(06.12.2019 09:52)
- Стек кончился? - ASDFS(06.12.2019 09:52)
							- Параллельного ничего нет. Разве что stdlib кривая. - POV_(06.12.2019 09:54,  ) )- А зачем что-то параллельное, чтобы завалить стек? Одного sprintf и достаточно. - VLLV(06.12.2019 10:58)
 
 
- Параллельного ничего нет. Разве что stdlib кривая. - POV_(06.12.2019 09:54, 
 
- Чехарда в адресной арифметике ? К примеру: Есть массив из 10 элементов, а делается запись в 11-ый. Результат: затёрта память в соседней переменой. "Чудный" результат. Был обнаружен при смене компилятора (или по другому выполнял линковку). - Zoro(06.12.2019 10:42)
							
 
- Так оно уходит в никуда при пошаговой работе. Соседние строчки с тем же sprintf норм работают. - POV_(06.12.2019 09:49, 
 
- В функции   RxTx(554 знак., 08.12.2019 00:29)