С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129

Потеря возвращаемого значение после возвращения из функции

16.08.2023, 13:38. Показов 1545. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
При использовании функции из динамиеской библиотеки при возращении значения оно бесследно пропадает.
Примеров самого кода предоставить не могу, но могу предоставить эквивалент.
Нуждаюсь в предположениях опытных разработчиков как такое возможно в принципе.

IDE: Visual Studio 2019
OS: Windows 10

Пример кода:

Вызов метода
C++
1
2
variable_type variable;
variable = lib_object.get_value(true);
Код вызываемого метода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
variable_type lib_object::get_value(bool mode) const
{
    //на это строке вариант самописного lock_guard защищающий чтение
    variable_type last_variable_value;
 
    if(mode)
    {
        last_variable_value = last_value;
    }
    else
    {
        last_variable_value = current_value;
    }
    return last_variable_value;
}
При отладке в дебагере всё выполняется и значения присваиваются до момента выхода из метода get_value.
То есть на строчке
C++
1
return last_variable_value;
в last_variable_value хранятся верные данные, но при выходе
из функции к строке
C++
1
 variable_type variable = lib_object.get_value(true);
дебаггер показывает, что вернулся мусор(возможно случайные данные, но совпадают с теми, что были в неинициализированной переменной).
В принципе никогда не встречался с такого рода проблемой, поэтому интересуют предположения, которые могли бы хоть как-то объяснить как такое может происходить.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2023, 13:38
Ответы с готовыми решениями:

"->": конечный тип возвращаемого значения недопустим после оператора объявления, не относящегося к функции
Здравствуйте, помогите пожалуйста исправить ошибку. "->": конечный тип возвращаемого значения недопустим после оператора объявления, не...

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

После возвращения из бана ВИЦ восстановится?
После бана или обнуления тиц с последующим снятием санкций с сайта ТИЦ ВИЦ будут прежними? т. е. при расчете ВИЦ будут ли...

16
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
16.08.2023, 13:47
Откуда знаете что оно пропадает? отлаживали? значит видели правильное значение а потом увидели в какой-то переменной неправильное. может ошибка в логике в функции.
отлаживали надеюсь без оптимизации кода.
на крайний случай - долго и муторно смотреть в отладчике и дизассембленом

Цитата Сообщение от Валерий_ Посмотреть сообщение
//на это строке вариант самописного lock_guard защищающий чтение
variable_type last_variable_value;
значит у вас ещё и многопоточка. - сомневаюсь что без контекста а только по аналогу кода можно разобраться
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.08.2023, 13:49
variable_type
Что это за тип?
0
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
16.08.2023, 14:23  [ТС]
Структура вида:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct  variable_type
{
    long field_1;
    long field_2;
    bool field_3;
    bool field_4;
    double field_5;
    double field_6;
    double field_7;
    double field_8;
    double field_9;
    double field_10;
    unsigned char field_11;
    unsigned char field_12;
}
Добавлено через 13 минут
Цитата Сообщение от Aledveu Посмотреть сообщение
отлаживали надеюсь без оптимизации кода.
Да, отлаживалось без оптимизации.
Цитата Сообщение от Aledveu Посмотреть сообщение
Откуда знаете что оно пропадает?
На строке с return находится верное значение с установленными полями. После выхода из метода в дебагере показывает, что из функции вернулось не то, что было в return.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.08.2023, 14:32
Цитата Сообщение от Валерий_ Посмотреть сообщение
После выхода из метода в дебагере показывает
Вы брикпойнт после строки с присваиванием поставьте. Если у вас на той строке стоит, то присваивание еше не произошло.

Добавлено через 6 минут
Цитата Сообщение от Валерий_ Посмотреть сообщение
Структура вида
Т.е. это POD тип? А декларация этой структуры при компиляции библиотеки и "клиентского" кода точно совпадают? Никаких #pragma pack случайно нет?
0
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
16.08.2023, 14:36  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вы брикпойнт после строки с присваиванием поставьте. Если у вас на той строке стоит, то присваивание еше не произошло.
Это понятно, и так было сделано.
0
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
16.08.2023, 14:40  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Никаких #pragma pack случайно нет?
Как я понимаю по настройкам проекта библиотеки - есть.
Миниатюры
Потеря возвращаемого значение после возвращения из функции  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.08.2023, 14:44
Лучший ответ Сообщение было отмечено Валерий_ как решение

Решение

Цитата Сообщение от Валерий_ Посмотреть сообщение
Как я понимаю по настройкам проекта библиотеки - есть.
Значит по настройкам "клиента" тоже должна быть. Или, если это невозможно, вручную в декларации библиотечных структур в клиентском коде указать нужно.
1
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
16.08.2023, 14:55  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Значит по настройкам "клиента" тоже должна быть. Или, если это невозможно, вручную в декларации библиотечных структур в клиентском коде указать нужно.
Можете поделиться пожалуйста предположениями как работает в текущем случае?
Каким образом данные теряются при возвращении?
Мне кажется, если бы отступы не совпадали должны были бы записываться неверные значения,
но записываться. А так выглядит как то, что переменная в принципе не меняется.

Спасибо за идею, постараюсь в ближайшее время проверить.

Добавлено через 4 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
вручную в декларации библиотечных структур в клиентском коде указать нужно
После указания выравнивания структур по 1 байту функция полность стала работоспособна. Боюсь в этом и была проблема. Мне всё ещё интересно как именно оно ломается в таком случае, но проблема выглядит решенной. Постараюсь в течении дня проверить на сколько смогу и закрыть вопрос за ответом zayats80888.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.08.2023, 14:55
Цитата Сообщение от Валерий_ Посмотреть сообщение
А так выглядит как то, что переменная в принципе не меняется.
Она у вас вообще не инициализированна, так что говорить о том, что там что-то меняется бессмысленно.
А пытаться объяснить UB не имея доступа к ассемблерному коду - гадание на кофейной гуще (да и зачем?).
1
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
16.08.2023, 15:00  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
А пытаться объяснить UB
Простите, не знал, что данный случай подпадает под UB.

Цитата Сообщение от zayats80888 Посмотреть сообщение
гадание на кофейной гуще (да и зачем?)
Справедливо, но поэтому я и прошу предположения, а не решения.
Спасибо ещё раз за помощь.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.08.2023, 08:21
Цитата Сообщение от Валерий_ Посмотреть сообщение
по настройкам проекта библиотеки - есть.
Вредительство самое натуральное.
Если на какую-то структуру нужно повесить кастомное выравнивание - это делается локально этой структуры.
Ставить выравнивание для всех типов в библиотеке - это заведомо обрекать себя на проблемы c совместимостью по ABI.
Эта настройка нужна для решения специфических случаев, а использовать ее по умолчанию - не нужно.

Поэтому самым правильным решением здесь будет вернуть выравнивание по умолчанию и для проекта и для библиотеки. Там, где это действительно нужно, задать его локально - через pragma pack.
1
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
17.08.2023, 10:44
Цитата Сообщение от Валерий_ Посмотреть сообщение
Как я понимаю по настройкам проекта библиотеки - есть.
А это вообще как? Как это вообще понимать - настройки библиотеки?
я знаю как это делается через pragma pack - но если это сделано в заголовочном файле - то эта опция будет и в программе и в библиотеке. а раздельно как?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.08.2023, 11:08
Цитата Сообщение от Aledveu Посмотреть сообщение
А это вообще как?
Ключом компилятора.
https://learn.microsoft.com/en... w=msvc-170

Добавлено через 2 минуты
И там как раз написано примерно то же, что и я говорил выше: "не используйте без обоснованной необходимости".
Don't use this option unless you have specific alignment requirements.
The C/C++ headers in the Windows SDK assume the platform's default alignment is used. Don't change the setting from the default when you include the Windows SDK headers, either by using /Zp on the command line or by using #pragma pack. Otherwise, your application may cause memory corruption at runtime.
0
2 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 129
17.08.2023, 12:53  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вредительство самое натуральное.
Соглашусь, ибо неочевидно для проектов, которые используют эту библиотеку.
Цитата Сообщение от Aledveu Посмотреть сообщение
А это вообще как? Как это вообще понимать - настройки библиотеки?
В настройках проекта в Visual Studio можно указать выравнивание для всех структур проекта.
Цитата Сообщение от DrOffset Посмотреть сообщение
"не используйте без обоснованной необходимости"
Так как библиотека писалась не мной, обоснованную необходимость мы уже никогда не узнаем.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.08.2023, 12:55
Цитата Сообщение от Валерий_ Посмотреть сообщение
Так как библиотека писалась не мной, обоснованную необходимость мы уже никогда не узнаем.
Скорее всего ее нет.
Поэтому я и говорю:
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому самым правильным решением здесь будет вернуть выравнивание по умолчанию и для проекта и для библиотеки. Там, где это действительно нужно, задать его локально - через pragma pack.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
17.08.2023, 13:15
Цитата Сообщение от Валерий_ Посмотреть сообщение
В настройках проекта в Visual Studio можно указать выравнивание для всех структур проекта.
Спасибо - я вот этого не знал ибо не пользуюсь VS и компилятором от MS. Вообще это реально диверсия. Так кто-нибудь поставит в либе а потом сиди ищи...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2023, 13:15
Помогаю со студенческими работами здесь

cookie пропадают после возвращения на главную
не как не пойму в чем дело, а дело вот в чем. сайт работает исключительно через index.php в нем происходит вся обрабтка запросов и...

Не включается ПК после переустановки винды на 10 и возвращения на 7
Хотел поставить Windows 10 Fall Creators Update, т.к. последние версии винды выдавали производительность ниже 7-ки, а эту версию я успешно...

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

Возвращения указателя на массив из функции
Как возвратитьуказатель на массив из функции в другую функцию и потом воспользоаваться этим массивом? #include "stdafx.h"...

После возвращения ноутбука из спящего режима не работает WiFi
Ноутбук Asus Eee PC. Если его закрыть, тоесть перевести в спящий режим и открыть - вывести из спящего режима то интернета не будет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru