Simptome
Atunci când rulați o aplicație care apelează funcția _sntscanf_s, apelul ar trebui să returneze o valoare EOF(-1). Totuși, atunci când rulați aplicația în Windows 10 Enterprise 2015 LTSB, caracterul nul injectat este ignorat. Acest lucru face ca câmpul numFields să primească o valoare eronată 1 în loc de valoarea EOF (-1 ).
De exemplu, această problemă apare în următoarea aplicație Visual C++:
#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
int main()
{
TCHAR szBuff[256];
double temp = 0;
wcscpy_s(szBuff, L"77777777");
// this should force the _sntscanf_s to return an EOF (-1) value
szBuff[0] = '\0';
int numFields = _sntscanf_s(szBuff, _countof(szBuff), _T("%lf"), &temp);
if (numFields == EOF)
{
printf("Correct Behavior!!!\r\n");
}
else
{
printf("BUG: _sntscanf_s failed to return EOF!!!\r\n");
}
return 0;
}
Cauză
Această problemă se produce din cauza unei probleme cunoscute în funcția common_vsscanf din fișierul Ucrtbase.dll care este inclus în Windows 10 Enterprise 2015 LTSB. Această problemă afectează întreaga familie de funcții scanf :
- _vsscanf_l
- vsscanf
- _sscanf_l
- sscanf
- _vsscanf_s_l
- vsscanf_s
- _sscanfs_l
- sscanf_s
- _snscanf_l
- _snscanf_s
- _snscanf_s_l
- _snscanf_s
- _vswscanf_l
- vswscanf
- _swscanf_l
- swscanf
- _vswscanf_s_l
- vswscanf_s
- _wsscanfs_l
- swscanf_s
- _snwscanf_l
- _snwscanf_s
- _snwscanf_s_l
- _snwscanf_s
Rezolvare
Pentru a rezolva această problemă, instalați actualizarea de service 8 mai 2018 - KB4103716 (versiunea sistemului de operare 10240.17861).