Triệu chứng
Khi bạn chạy ứng dụng gọi hàm _sntscanf_s , cuộc gọi sẽ trả về một giá trị EOF(-1) . Tuy nhiên, khi bạn chạy ứng dụng trên Windows 10 Enterprise 2015 LTSB, ký tự rỗng tiêm được bỏ qua. Điều này khiến trường numFields để nhận một giá trị sai 1 thay vì giá trị EOF (-1) .
Ví dụ: sự cố này xảy ra trong ứng dụng Visual C++ sau đây:
#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;
}
Nguyên nhân
Sự cố này xảy ra do sự cố các chức năng common_vsscanf trong tệp Ucrtbase.dll được bao gồm trong Windows 10 Enterprise 2015 LTSB. Vấn đề này ảnh hưởng đến dòng toàn bộ scanf chức năng:
-
_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
Giải pháp
Để giải quyết vấn đề này, cài đặt dịch vụ Cập Nhật 8 tháng 5 năm 2018-KB4103716 (OS xây dựng 10240.17861).