Как использовать gsl::span для исправления Нет массива к предупреждению о затухании указателя?
Я пытаюсь разрешить следующее предупреждение.
warning C26485: Expression 'pNMLink->item.szUrl':
No array to pointer decay. (bounds.3...)
Это предупреждение вызвано следующим кодом.
auto pNMLink = reinterpret_cast<PNMLINK>(pNMHDR);
ShellExecuteW(nullptr, L"open", pNMLink->item.szUrl, nullptr, nullptr, SW_SHOWNORMAL);
Чрезвычайно ограниченная документация C++ Core Guidelines предполагает, что решение состоит в том, чтобы использовать span.
array decay -- use span (from the GSL)
К сожалению, он не дает информации о том, как построить этот диапазон из массива.
Я попробовал следующее.
gsl::span<wchar_t> url(pNMLink->item.szUrl);
Я пробовал и ряд других вариантов. Все они приводят к одному и тому же предупреждению. Какое магическое заклинание мне нужно использовать, чтобы избежать предупреждения?
1 ответ
Это может показаться ошибкой в инструменте статического анализа. Откуда мне знать? Потому что вы не получите это предупреждение, если вы делаете это:
int arr[10];
gsl::span<int> sp1(arr);
Но вы получите предупреждение, если сделаете это:
struct Arr { int arr[10]; };
Arr test;
gsl::span<int> sp2(test.arr);
gsl::span
имеет конструктор, который принимает параметры массива по ссылке, поэтому при передаче массива не должно происходить затухания. Как показано sp1
, который не дает предупреждения. И нет никаких причин C++, почему выборка массива из структуры будет вызывать затухание при использовании автоматической переменной.
Ясно, что это ошибка в инструменте анализа, ложное срабатывание.