Я получаю пару вопросов анализа кода:InterlockedExchange проблемы с C28112/3
(774): предупреждение C28113: Доступ к локальному переменному lAbort через ВЗАИМОСВЯЗАННОЙ функцию: Это необычное использование, которое может be пересмотрено.
(775): warning C28112: переменная (lAbort), к которой осуществляется доступ через функцию . Функция блокировки должна всегда выполняться через функцию блокировки . См. Строку 774: Не всегда безопасно обращаться к переменной , к которой осуществляется доступ через семейство функций Interlocked * в любом другим способом.
из этого кода:
BOOL CHttpDownloader::Abort()
{
volatile LONG lAbort = 0;
InterlockedExchange(&lAbort, m_lAbort);
return (lAbort != 0);
}
Признаюсь, что этот код/класс даже не мое. Оригинальный автор не поддерживает его прямо сейчас, и я не использовал эти типы volatile
переменных самостоятельно.
Однако он всегда работал, и неясно, как правильно пересмотреть код, чтобы устранить предупреждение.
код Наследство было мало выбора, кроме как использовать 'volatile', поскольку C++ не определяет подходящую модель памяти. Это уже не так; современные версии C++ решили эту проблему, и современные версии компилятора Microsoft начали предлагать поддержку для этого. Для обратной совместимости оригинальная семантика Microsoft для 'volatile' остается по умолчанию при настройке на x86-процессоры, но вам рекомендуется обновлять свой код, когда это возможно. См. Также [документация MSVC для 'volatile'] (https://msdn.microsoft.com/en-us/library/12a04hfd.aspx). –
В любом случае, это просто в стороне. Что касается вашего вопроса и предупреждений, я не уверен, что вы считаете непонятным о них. Они кажутся мне довольно очевидными. Какой смысл использовать Interlocked semantics для * локальной * переменной? Предположительно, эта локальная переменная не может быть доступна за пределами функции, поэтому она говорит, что это необычно. Это должен быть код повторного входа? И второе предупреждение говорит о том, что последняя строка ('return (lAbort! = 0)'), вероятно, неверна, поскольку она не использует взаимосвязанные семантики. –
@CodyGray Короткий и честный ответ - я не знаю. Но я только что обнаружил, что в библиотеке HTTP-загрузки есть обновление: http://www.naughter.com/httpdownloaddlg.html. В нем говорится, что он занимается вопросами анализа кода. Поэтому я пытаюсь. –