[VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 27.02.21 15:23
Оценка:
Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.

Debug   : 0.0000000000000000 (18 символов)
Release : 0.000000000000000  (17 символов)

Оказалось, что проблема в vsnprintf.

Накатал небольшую демку, идентичную коду той программы, и собрал её в VS2015, VS2017, VS2019.
  Вот
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdarg.h>

#include <iostream>

//------------------------------------------------------------------------
int SNPRINTF(char* buffer, size_t count, const char* format...)
{
 va_list args;

 va_start(args, format);

 const int rc = vsnprintf(buffer, count, format, args);

 buffer[count - 1] = 0;

 va_end(args);

 return rc;
}//snprintf

//------------------------------------------------------------------------
int main()
{
 int precision=16;

 double d=0.0;

 int width=23;

 char temp[50];
 
 const char num_format[]="%- #*.*g";

 int rc=SNPRINTF(temp,sizeof(temp),num_format,width,precision,d);

 using namespace std;

 cout<<"["<<rc<<"]\""<<temp<<"\""<<endl;

 return 0;
}//main

////////////////////////////////////////////////////////////////////////////////

Проблема(?) наблюдается во всех трех случаях.

  Результаты запуска
>call bin\vs2015-Win32-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2015-Win32-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "

>call bin\vs2015-x64-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2015-x64-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "

>call bin\vs2017-Win32-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2017-Win32-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "

>call bin\vs2017-x64-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2017-x64-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "

>call bin\vs2019-Win32-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2019-Win32-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "

>call bin\vs2019-x64-Debug\ConsoleApplication1.exe
[23]" 0.0000000000000000    "

>call bin\vs2019-x64-Release\ConsoleApplication1.exe
[23]" 0.000000000000000     "
Что за ботва, Пендальф?

Это ошибка в реализации vsnprintf или я чего не догоняю
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: [VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Alexander G Украина  
Дата: 27.02.21 15:39
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.


У меня не воспроизводится. Всегда 17 символов.

/MT,/MTd или /MD,/MDd ?

Вообще стоит из VS2019 Help->Send Feedback->Report a problem, потому что баг
Русский военный корабль идёт ко дну!
Re[2]: [VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 27.02.21 15:47
Оценка:
Здравствуйте, Alexander G, Вы писали:

КД>>Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.


AG>У меня не воспроизводится. Всегда 17 символов.


AG>/MT,/MTd или /MD,/MDd ?


/MD,/MDd

AG>Вообще стоит из VS2019 Help->Send Feedback->Report a problem, потому что баг
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: [VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 27.02.21 16:16
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.


AG>У меня не воспроизводится. Всегда 17 символов.


В 2015-ой?

Странно.

Я добавил конфигурации со статической библиотекой — так там всегда 18 символов (как в отладочной с библиотекой в DLL).

Немного доработал демку, чтобы было понятно где сколько символов

  Вот
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdarg.h>

#include <iostream>

//------------------------------------------------------------------------
int SNPRINTF(char* buffer, size_t count, const char* format...)
{
 va_list args;

 va_start(args, format);

 const int rc = vsnprintf(buffer, count, format, args);

 buffer[count - 1] = 0;

 va_end(args);

 return rc;
}//snprintf

//------------------------------------------------------------------------
int main()
{
 int precision=16;

 double d=0.0;

 int width=23;

 char temp[50];
 
 const char num_format[]="%- #*.*g";

 int rc=SNPRINTF(temp,sizeof(temp),num_format,width,precision,d);

 using namespace std;

 int n=rc;

 for(;n!=0 && temp[n-1]==' ';--n);

 for(int c=n,i=0;i!=c && temp[i]==' ';++i,--n);

 cout<<"["<<n<<"]\""<<temp<<"\""<<endl;

 return 0;
}//main

////////////////////////////////////////////////////////////////////////////////

  Вывод сборок 2015-ой
>call bin\vs2015-Win32-Debug\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

>call bin\vs2015-Win32-Release\ConsoleApplication1.exe
[17]" 0.000000000000000     "

>call bin\vs2015-x64-Debug\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

>call bin\vs2015-x64-Release\ConsoleApplication1.exe
[17]" 0.000000000000000     "

>call bin\vs2015-Win32-Debug_S\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

>call bin\vs2015-Win32-Release_S\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

>call bin\vs2015-x64-Debug_S\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

>call bin\vs2015-x64-Release_S\ConsoleApplication1.exe
[18]" 0.0000000000000000    "

В 2017-ой, 2019-ой вывод такой же.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: [VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Alexander G Украина  
Дата: 27.02.21 16:45
Оценка: 12 (2)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>В 2015-ой?


КД>Странно.


В 2015 и в 2019 у меня всегда 17

Тут https://rextester.com/l/cpp_online_compiler_visual
всегда 18

Возможно, поведение зависит от версии рантайма. У меня всё свежайшее вроде.
Русский военный корабль идёт ко дну!
Re[2]: [VS] vsnprintf по разному обрабатывает 0.0 в Release
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 01.03.21 11:02
Оценка:
Здравствуйте, Alexander G, Вы писали:

КД>>Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.


AG>У меня не воспроизводится. Всегда 17 символов.


AG>/MT,/MTd или /MD,/MDd ?


AG>Вообще стоит из VS2019 Help->Send Feedback->Report a problem, потому что баг


Я им написал.

Возможно проблема в разных версиях ucrtbase.dll / ucrtbased.dll

ucrtbased.dll — 10.0.18362.1

ucrtbase.dll — 10.0.19041.789
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 02.03.2021 9:39 DDDX . Предыдущая версия .
Re[3]: [VS] vsnprintf по разному обрабатывает 0.0 в Release
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.03.21 08:59
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Возможно проблема в разных версиях ucrtbase.dll / ucrtbased.dll


КД>ucrtbased.dll — 10.0.18362.1


КД>ucrtbase.dll — 10.0.19041.789


Я сегодня до упора обновил 2019-ые (CE и Preview) — не помогло.

Нашел у себя кучу ucrtbased.dll разных версий. Копирую их в каталог с exe — она загружается, но на результат не влияет. Все равно выводится 18 символов.

С релизной ucrtbase.dll не прокатывает — она всегда грузится из Windows\System32.

Отладчик говорит, что vsnprintf делегирует вызов в ucrtbased.dll!__stdio_common_vsprintf

Dependency Walker говорит, что __stdio_common_vsprintf находится в api-ms-win-crt-stdio-l1-1-0.dll

В целом, понятно, что вообще нихрен не понятно Куда копать-то?

----
Может кто подскажет — где взять правильную ucrtbased.dll? Я так понимаю нужна 10.0.19041.789.

MS говорит, что они будут Investigate эту проблему, но надежд на них мало
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: [VS] vsnprintf по разному обрабатывает 0.0 в Release
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 15.03.21 07:25
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Обнаружил, что отладочная и релизная версия одной программы (откомпилирована в VS2015) возвращают различающиеся текстовые представления double 0.0.


AG>У меня не воспроизводится. Всегда 17 символов.


Если не сложно, выложи куда нибудь свои ucrtbased.dll (32 и 64 бита) из каталогов C:\Windows\SysWOW64 и C:\Windows\System32.

MS говорит — обновитесь, мы все исправили.

Но у меня все обновлено до упора.

Возможно кто-то заменил crtbased.dll на старую версию, а VS этого не замечает
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 15.03.2021 9:06 DDDX . Предыдущая версия . Еще …
Отредактировано 15.03.2021 9:06 DDDX . Предыдущая версия .
Re[3]: [VS] vsnprintf по разному обрабатывает 0.0 в Release и Debug сборках
От: Alexander G Украина  
Дата: 15.03.21 08:24
Оценка: 9 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

AG>>У меня не воспроизводится. Всегда 17 символов.


КД>Если не сложно, выложу куда нибудь свои ucrtbased.dll (32 и 64 бита) из каталогов C:\Windows\SysWOW64 и C:\Windows\System32.


http://files.rsdn.org/74426/ucrtbased.zip
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.