2016-12-19 13 views
2

Я получаю пару вопросов анализа кода: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 переменных самостоятельно.

Однако он всегда работал, и неясно, как правильно пересмотреть код, чтобы устранить предупреждение.

+0

код Наследство было мало выбора, кроме как использовать 'volatile', поскольку C++ не определяет подходящую модель памяти. Это уже не так; современные версии C++ решили эту проблему, и современные версии компилятора Microsoft начали предлагать поддержку для этого. Для обратной совместимости оригинальная семантика Microsoft для 'volatile' остается по умолчанию при настройке на x86-процессоры, но вам рекомендуется обновлять свой код, когда это возможно. См. Также [документация MSVC для 'volatile'] (https://msdn.microsoft.com/en-us/library/12a04hfd.aspx). –

+0

В любом случае, это просто в стороне. Что касается вашего вопроса и предупреждений, я не уверен, что вы считаете непонятным о них. Они кажутся мне довольно очевидными. Какой смысл использовать Interlocked semantics для * локальной * переменной? Предположительно, эта локальная переменная не может быть доступна за пределами функции, поэтому она говорит, что это необычно. Это должен быть код повторного входа? И второе предупреждение говорит о том, что последняя строка ('return (lAbort! = 0)'), вероятно, неверна, поскольку она не использует взаимосвязанные семантики. –

+0

@CodyGray Короткий и честный ответ - я не знаю. Но я только что обнаружил, что в библиотеке HTTP-загрузки есть обновление: http://www.naughter.com/httpdownloaddlg.html. В нем говорится, что он занимается вопросами анализа кода. Поэтому я пытаюсь. –

ответ

0

Занятия были пересмотрены автором. Этот метод в настоящее время выглядит следующим образом:

BOOL CHTTPDownloader::Abort() 
{ 
    return (m_lAbort != 0); 
} 

Вот пересмотренные классы:

http://www.naughter.com/httpdownloaddlg.html