Может Visual Studio 2015 (MSVC 19) обнаружить & amp; сообщить недостижимый код (и если да, то как) [дублировать]

Консенсус заключается в использовании словаря для этого - см. другие ответы. Это хорошая идея для большинства случаев, однако есть много аспектов, связанных с этим:

  • вы сами будете нести ответственность за этот словарь, включая сбор мусора (из переменных in-dict) и т. Д. .
  • нет никакой локальности или глобальности для переменных переменных, это зависит от глобальности словаря
  • , если вы хотите переименовать имя переменной, вам придется сделать это вручную
  • однако вы гораздо более гибкие, например вы можете решить перезаписать существующие переменные или ... ... выбрать реализацию константных переменных для создания исключения при перезаписи для разных типов и т. д.

Тем не менее, я реализовал variable variables manager -класс, который предоставляет некоторые из вышеперечисленных идей. Он работает для python 2 и 3.

Вы использовали бы класс следующим образом:

from variableVariablesManager import VariableVariablesManager

myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])

# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
    myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
    print("not allowed")
except AttributeError as e:
    pass

# rename a variable
myVars.renameVariable('myconst', 'myconstOther')

# preserve locality
def testLocalVar():
    myVars = VariableVariablesManager()
    myVars['test'] = 13
    print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])

# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
    myVars = VariableVariablesManager()
    print("inside function myVars['globalVar']:", myVars['globalVar'])
    myVars['globalVar'] = 13
    print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])

Если вы хотите разрешить переписывание переменных с помощью только тот же тип:

myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)

72
задан N.R 22 June 2015 в 07:50
поделиться

1 ответ

Вероятно, лучший и самый простой способ добиться того, что вам нужно, - использовать встроенный инструмент анализа кода в Visual Studio, чтобы найти и принять вас непосредственно к мертвому коду и неиспользуемым членам.

К этому эффект, я просто создал новый файл набора правил анализа кода (Via File-> New-> File, убедившись, что General на левой панели был выбран и прокручивается вниз, чтобы найти набор правил анализа кода, указав ему имя файла, затем выполните поиск и выбор ниже). Ниже приведено содержимое файла набора правил, которое вы можете просто скопировать, и вставьте его в новый файл с расширением .ruleset для использования.

С учетом файла набора правил можно щелкнуть правой кнопкой мыши по файлу проекта в панель «Проводник решений» и выберите «Свойства». В окне свойств проекта щелкните вкладку «Анализ кода» на левой панели, а затем нажмите «Открыть», чтобы перейти к местоположению файла .ruleset. Если вы перейдете к свойствам файла решения (в отличие от файла проекта), вы можете установить файл анализа кода для каждого проекта в решении в одном месте (в разделе «Параметры анализа кода» и используя раскрывающийся список там, чтобы выбрать файл набора правил. ПРИМЕЧАНИЕ: вы, должно быть, ранее просмотрели файл набора правил, чтобы он отображался в раскрывающемся списке в этом окне свойств, однако).

Затем вы просто запускаете анализ кода на проекты / решение (Via Analyze-> Run Code Analysis On Solution -OR- Alt + F11), и он будет возвращаться в виде предупреждений, любых неописанных методов или неиспользуемых элементов, которые он находит.

Будьте осторожны, так как один из способов анализа кода для мертвого кода может направить вас неправильно, это если ссылка «скрыта», только когда-либо вызывающая метод через делегатов и, конечно же, отражение.

Правилами обнаружения мертвого кода, в частности, являются:

  • Частные методы, которые не вызываются из какого-либо другого кода (CA1811)
  • Неиспользуемые локальные переменные (CA1804)
  • Неиспользуемые частные поля (CA1823)
  • Не используется параметры (CA1801)
  • Внутренние классы, которые не создаются из любого другого кода (CA1812).
  • Мертвый код в побитовом или ограниченном коммутаторе (C6259)

Ниже приведено содержимое файла .ruleset, которое можно выполнить, выполнив описанные выше шаги для вашего соответствия. Вы можете просто скопировать приведенный ниже XML, вставить его в блокнот ++, сохранить где-нибудь с расширением .ruleset, просмотреть и использовать, как описано выше:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>

Надеюсь, это вам поможет, и не забудьте выберите лучший ответ.

88
ответ дан Brian Webster 19 August 2018 в 14:44
поделиться
  • 1
    Я не думаю, что это полностью отвечает на вопрос. Основное различие заключается в том, что CodeLens скажет вам, что метод PUBLIC имеет нулевые ссылки во всем решении. Это ключ. FxCop, R #, и ваш метод отлично подходит для любого, что не является публичным. – Scott Wylie 23 June 2016 в 22:55
  • 2
    @ScottWylie - Я не согласен. Я просто попробовал вышеуказанное решение, и оно не отображало общедоступные методы без ссылок. CodeLens был исключительным при пометке мертвого кода, непринятых локальных файлов и неиспользуемых переменных. Я думаю, что это дает большинству людей то, что они хотят, без использования стороннего инструмента. – mike 30 November 2017 в 07:05
  • 3
    @mike. Подумайте об этом: если вы хотите найти мертвый код с массовой операцией, вы, как правило, не заботитесь о частных / защищенных членах, потому что это местные проблемы. Например, я переношу проект 500k + LoC с более 100 проектами и 10+ решениями в архитектуру паттерна репозитория. После миграции компонента мне нужно знать, какие старые интерфейсы я могу удалить. Некоторые IDE, такие как Eclipse, имеют инструменты для этого. Выделенные локальные методы просто не беспокоят меня, мне нужен список классов / интерфейсов PUBLIC, где объектив кода скажет мне «0». – Oliver Schimmer 16 April 2018 в 20:57
Другие вопросы по тегам:

Похожие вопросы: