Как избавиться от этого предупреждения C6385 считывание недопустимых данных
Предупреждение C6385 чтение недопустимых данных из 'CRdr': читаемый размер составляет '(unsigned int)*108+4' байт, но '216' байт могут быть прочитаны.
struct CReaders { int m_IntAddr{};//Card Reader number in ASC not HEX. CARD READER TABLE CStringA m_HexAddr = _T("");//Card Reader Address in Hex, LAST Octet CStringA m_Loc = _T("");//Location of Card Reader, Text Description CStringA m_Desc = _T("");//Description of Card Reader, Additional Text int m_BUS{}; //WHICH COM PORT IS BEING USED BOOL m_ELEVATOR{}; CStringA m_CmdLv = _T("");//max of "CMD_MAX"=15 command levels int m_CmdLvInt[CMD_MAX]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//integer BOOL m_VOID{}; int m_Type{}; //reader module motherboard type volatile BOOL m_GOOD_CHK{}; //USED ONLY IN OMU2 AND CHECKING BOOL m_DISPLAY{}; //FOR USE IF L9 OR L10 DEVICES TO USE BOOL m_DISPLAY_OFFLine{};//FOR DISPLAYING ON THE TRANSACTION }; //DB opened and start reading; how many records m_ReaderSet->MoveFirst(); do { m_ReaderCount++; //unsigned int m_ReaderSet->MoveNext(); }while(!m_ReaderSet->IsEOF()); if(m_ReaderCount > READERS_MAX) m_ReaderCount = READERS_MAX; //if memory is inside CRdr, delete it if(CRdr) delete [] CRdr; CRdr = 0; CRdr = new CReaders[m_ReaderCount+10]; // INIT STRUCT TO ZERO //ONE BASED HERE! STARTS AT 1 for(c=0;c<=(int)m_ReaderCount+1;c++) { CRdr[c].m_BUS = 0; CRdr[c].m_ELEVATOR = FALSE; CRdr[c].m_GOOD_CHK = TRUE; CRdr[c].m_IntAddr = 0; CRdr[c].m_Type = 0; CRdr[c].m_VOID = FALSE; CRdr[c].m_DISPLAY = FALSE; CRdr[c].m_DISPLAY_OFFLine= FALSE; CRdr[c].m_Loc = _T("");//Warning C6385 is here, CRdr[c].m_HexAddr = _T(""); CRdr[c].m_CmdLv = _T(""); CRdr[c].m_Desc = _T(""); }
CStringA упаковывает до 8 бит. Столбец для m_Loc-это nvarchar(50), null в БД. В
программа, ее вытащили через CStringA:
RFX_Text(pFX, _T("[Loc]"), m_Loc); //m_Loc-это CStringA
Мой вопрос таков: как мне удалить это предупреждение?
Компилятор VS2019-это "все предупреждения", и я обнаружил это с помощью инструмента Analize на VS2019.
Компилятор настроен на "использование Многобайтового набора символов"
Компилятор не знает БД, поэтому 50 nvarchar неизвестны компилятору.
Я ничего не могу сделать с CStringA в структуре, кроме
инициализируйте его нулем или ничем.
Хотел установить его предел, но не может быть не во время инициализации. Я могу "освободить буфер, установить предел" позже, но это не избавит от предупреждения.
Компилятор использует стандартную 8 - битную упаковку для структур.
Я хотел бы дать больше кода, но это часть кода в 300 000 строк, который я сделал. Программа работает нормально и работает уже много лет но это самое главное
последнее раздражение, с которым я хотел бы справиться, но не знаю как, есть какие-нибудь подсказки?
Это один из примеров:
У меня есть 10 других структур с CStrings в качестве членов, которые имеют те же предупреждения.
Еще одна структура использует CTime m_EndSched{}; в качестве члена и получает такое же предупреждение.
Предупреждение C6385 чтение недопустимых данных из 'SchdLvl': читаемый размер составляет '(unsigned int)*100+4' байт, но '200' байт могут быть прочитаны.
ДБ=конечная дата(дата-время,значение null)
Самое последнее средство изменить все CStrings на char, но это означает использование sprintf/scopy/strcat/sprintf_s (который скоро будет запрещен)или команды format на CString в обратном порядке.
Что я уже пробовал:
Я пытался ввести CString в структуру, но это незаконно. Я попытался упаковать до 2,4,8,16 бит с помощью #pragma pack(n) или в самом компиляторе. Я попытался "освободить установленный предел" для CString позже в коде, но компилятор все еще имеет предупреждение.
Rick York
Нет, функции sprintf, strcpy, в функции strcat и не забанит, и не будет МНОГОБАЙТОВОЙ кодировки. Это стандартные библиотечные функции, и Microsoft не имеет права запрещать их использование в библиотеке.
Если они действительно удаляют их из RTL VS, то вы можете использовать свои собственные реализации из них. Я уверен, что там будет из чего выбирать.
inlandchris1
Спасибо тебе за это. У меня сложилось впечатление, что их планировалось удалить из-за страха перед вирусом. Я сделаю мысленную заметку.
KarstenK
возможным решением является использование массива TCHAR подходящего размера. А для петли пределы выглядят странно.
inlandchris1
Ну, это хорошая идея, но это та же самая энергия, чтобы заменить все CStrings на chars [?], просто много работы, но это мое последнее средство, спасибо за ответ
inlandchris1
Я согласен с циклом, просто хотел выделить больше, чем мне нужно, чтобы предотвратить переполнение, но на самом деле все, что мне нужно, - это еще 1 на распределение.