Как использовать 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++, почему выборка массива из структуры будет вызывать затухание при использовании автоматической переменной.

Ясно, что это ошибка в инструменте анализа, ложное срабатывание.

Другие вопросы по тегам