Size: a a a

2020 April 24

AB

Artöm Bakri Al-Sarmini in pro.cxx
vehlwn
7.3.11 Pointer conversions [conv.ptr]
A null pointer constant is an integer literal (5.13.2) with value zero or a prvalue of type std::nullptr_t.

Так нуллптр должен быть (после конвертации в указатель) численно равен интегральному нулю или не должен?
Если (void*)nullptr не 0, то это определение нулл поинтер констант неверно.
Должен быть численно равен нулевому указателю
источник

ЮП

Юрий Першин in pro.cxx
Ivan Azoyan
спрашивай
Проблема состоит в том, что имеется огромный проект, в котором этих sscanf как грязи, и быстро не переделаешь.
Входящий буфер далеко не всегда замкнут нулем. Коротко говоря, это приводит к исключению, которое ловит ApplicationVerifier (когда мы ищем в проекте с его помошью совершенно другие места с таким исключением). Существуют ли хорошие способы выйти тут сухими из воды (и проект не перепахивать, и проверку провести) ?
источник

AT

Alexey Tkachenko in pro.cxx
#define ?
источник

ЮП

Юрий Першин in pro.cxx
Вот пример кода
int main()
{
   char *mem = new char[15];
   memcpy(mem, "01-01-15,00:00)", 15);
   uint16_t year, month, day, hour, minute;
   sscanf_s(mem, "%02hu%02hu%02hu%02hu%02hu)", &day, &month, &year, &hour, &minute);
   delete[] mem;
}
источник

ЮП

Юрий Першин in pro.cxx
Если это мне, то Вы предлагаете отправить через #define управление в другую функцию?
источник

AT

Alexey Tkachenko in pro.cxx
можно заменить его на что-то некомпилируемое и посмотреть, сколько раз в проекте ошибка компиляции произойдёт и постепенно разгребать эти авгиевы конюшни
источник

AT

Alexey Tkachenko in pro.cxx
можно определить свою функцию вместо библиотечной с той же сигнатурой, которая, быть может, будет больше знать о ситуации откуда-то из внешнего источника
источник

ЮП

Юрий Першин in pro.cxx
Alexey Tkachenko
можно заменить его на что-то некомпилируемое и посмотреть, сколько раз в проекте ошибка компиляции произойдёт и постепенно разгребать эти авгиевы конюшни
Да и так найти можно, по имени. Проблему в том виде, какая она сейчас есть, это не решит. Я склоняюсь к поиску альтернативной реализации sscanf, которая не пытается лезть в буфер дальше необходимого
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
так и эта не лезет
источник

ЮП

Юрий Першин in pro.cxx
Vyacheslav Olkhovchenkov
так и эта не лезет
к сожалению, она вычисляет размер при помощи strnlen - лезет
источник

ЮП

Юрий Першин in pro.cxx
я про реализацию в msvc, возможно другие не делают так
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
так это. вот я беру библиотеку
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
int
vsscanf_l(const char * __restrict str, locale_t locale,
               const char * __restrict fmt, __va_list ap)
{
       FILE f = FAKE_FILE;
       FIX_LOCALE(locale);

       f._flags = __SRD;
       f._bf._base = f._p = (unsigned char *)str;
       f._bf._size = f._r = strlen(str);
       f._read = eofread;
       return (__svfscanf(&f, locale, fmt, ap));
}
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
дальше понятно? и искать ничего не надо
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
с мелкомякими так простонайти может и не выйдет, конечно
источник

ЮП

Юрий Першин in pro.cxx
Vyacheslav Olkhovchenkov
дальше понятно? и искать ничего не надо
непонятно пока - strlen вызовет беспокойство AppVerifier
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
бля. ну вот же вызывается в конце __svfscanf которй передается структура из указателя и длинны
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
она уже никаких strlen не зовет, а по формату полностью совместима, поскольку ssanf просто обертка над ней
источник

ЮП

Юрий Першин in pro.cxx
Vyacheslav Olkhovchenkov
бля. ну вот же вызывается в конце __svfscanf которй передается структура из указателя и длинны
длина неизвестна, ее вычисляет strlen, под AppVerifier это приводит к срабатыванию проверки (ложному)
источник

VO

Vyacheslav Olkhovchenkov in pro.cxx
вот напиши свою обертку котрая сразу будет получать укзатель с длинной
источник