- PVSM.RU - https://www.pvsm.ru -
Мы решили в меру своих сил регулярно искать и устранять уязвимости и баги в различных проектах. Можно назвать это помощью open-source проектам. Можно — разновидностью рекламы или тестированием анализатора. Еще вариант — очередной способ привлечения внимания к вопросам качества и надёжности кода. На самом деле, не важно название, просто нам нравится это делать. Назовём это необычным хобби. Давайте посмотрим, что интересного было обнаружено в коде различных проектов на этой неделе. Мы нашли время сделать исправления и предлагаем вам ознакомиться с ними.
PVS-Studio [1] — это инструмент, который выявляет в коде многие разновидности ошибок и уязвимостей. PVS-Studio выполняет статический анализ кода и рекомендует программисту обратить внимание на участки программы, в которых с большой вероятностью содержатся ошибки. Наилучший эффект достигается тогда, когда статический анализ выполняется регулярно. Идеологически предупреждения анализатора подобны предупреждениям компилятора. Но в отличии от компиляторов, PVS-Studio выполняет более глубокий и разносторонний анализ кода. Это позволяет ему находить ошибки в том числе и в компиляторах: GCC [2]; LLVM 1 [3], 2 [4], 3 [5]; Roslyn [6].
Поддерживается анализ кода на языках C, C++ и C#. Анализатор работает под управлением Windows и Linux. В Windows анализатор может интегрироваться как плагин в Visual Studio.
Для дальнейшего знакомства с анализатором, предлагаем изучить следующие материалы:
В этом разделе приведены дефекты, которые попадают под классификацию CWE и, по сути, являются уязвимостями. Конечно, не в каждом проекте уязвимости создают какую-то практическую угрозу, но хочется продемонстрировать, что мы умеем находить подобные ситуации.
1. CoreFX. CWE-476 (NULL Pointer Dereference)
V3080 [10] Possible null dereference. Consider inspecting '_swtFirst'. MemberLookup.cs 109
if (_swtFirst == null)
{
_swtFirst.Set(sym, type); // <=
....
}
→ Pull Request [11]
2. CoreFX. CWE-476 (NULL Pointer Dereference)
V3080 [10] Possible null dereference. Consider inspecting 'tabClasses'. PropertyTabAttribute.cs 225
if (tabClasses != null) // <=
{
if (tabScopes != null && tabClasses.Length != tabScopes.Length)
{
....
}
_tabClasses = (Type[])tabClasses.Clone();
}
else if (tabClassNames != null)
{
if (tabScopes != null &&
tabClasses.Length != tabScopes.Length) // <=
{
....
}
_tabClassNames = (string[])tabClassNames.Clone();
_tabClasses = null;
}
→ Pull Request [11]
3. CoreFX. CWE-476 (NULL Pointer Dereference)
V3080 [10] Possible null dereference. Consider inspecting 'BaseSimpleType'. SimpleType.cs 368
if ((BaseSimpleType == null && otherSimpleType.BaseSimpleType != null)
&&
(BaseSimpleType.HasConflictingDefinition(...)).Length != 0) // <=
return ("BaseSimpleType");
→ Pull Request [11]
4. CoreFX. CWE-476 (NULL Pointer Dereference)
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'o', 'other'. CompilerInfo.cs 106
CompilerInfo other = o as CompilerInfo;
if (o == null)
{
return false;
}
return CodeDomProviderType == other.CodeDomProviderType && ... // <=
→ Pull Request [11]
5. CoreFX. CWE-476 (NULL Pointer Dereference)
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'myObject', 'myString'. CaseInsensitiveAscii.cs 46
string myString = myObject as string;
if (myObject == null)
{
return 0;
}
int myHashCode = myString.Length; // <=
PVS-Studio: fixed vulnerability CWE-476 (NULL Pointer Dereference)
→ Pull Request [11]
6. CoreFX. CWE-476 (NULL Pointer Dereference)
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'a', 'nodeA'. AttributeSortOrder.cs 22
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'b', 'nodeB'. AttributeSortOrder.cs 22
XmlNode nodeA = a as XmlNode;
XmlNode nodeB = b as XmlNode;
if ((a == null) || (b == null))
throw new ArgumentException();
int namespaceCompare =
string.CompareOrdinal(nodeA.NamespaceURI, nodeB.NamespaceURI); // <=
→ Pull Request [11]
7. CoreFX. CWE-476 (NULL Pointer Dereference)
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'a', 'nodeA'. NamespaceSortOrder.cs 21
V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'b', 'nodeB'. NamespaceSortOrder.cs 21
XmlNode nodeA = a as XmlNode;
XmlNode nodeB = b as XmlNode;
if ((a == null) || (b == null))
throw new ArgumentException();
bool nodeAdefault = Utils.IsDefaultNamespaceNode(nodeA);
bool nodeBdefault = Utils.IsDefaultNamespaceNode(nodeB);
→ Pull Request [11]
8. MSBuild. CWE-476 (NULL Pointer Dereference)
V3095 [13] The 'name' object was used before it was verified against null. Check lines: 229, 235. Microsoft.Build.Tasks GenerateBindingRedirects.cs 229
V3095 [13] The 'publicKeyToken' object was used before it was verified against null. Check lines: 231, 235. Microsoft.Build.Tasks GenerateBindingRedirects.cs 231
private void UpdateExistingBindingRedirects(....)
{
....
var name = assemblyIdentity.Attribute("name");
var nameValue = name.Value; // <=
var publicKeyToken = assemblyIdentity.
Attribute("publicKeyToken");
var publicKeyTokenValue = publicKeyToken.Value; // <=
var culture = assemblyIdentity.Attribute("culture");
var cultureValue = culture == null ?
String.Empty : culture.Value;
if (name == null || publicKeyToken == null)
{
continue;
}
....
}
→ Pull Request [14]
1. MSBuild
V3041 [15] The expression was implicitly cast from 'long' type to 'float' type. Consider utilizing an explicit type cast to avoid the loss of a fractional part. An example: double A = (double)(X) / Y;. Microsoft.Build CommunicationsUtilities.cs 615
private static long s_lastLoggedTicks = DateTime.UtcNow.Ticks;
internal static void Trace(....)
{
....
long now = DateTime.UtcNow.Ticks;
float millisecondsSinceLastLog =
(float)((now - s_lastLoggedTicks) / 10000L);
....
}
→ Pull Request [14]
2. MSBuild
V3118 [16] Milliseconds component of TimeSpan is used, which does not represent full time interval. Possibly 'TotalMilliseconds' value was intended instead. MSBuild XMake.cs 629
public static ExitType Execute(string commandLine)
{
....
if (!String.IsNullOrEmpty(timerOutputFilename))
{
AppendOutputFile(timerOutputFilename,
elapsedTime.Milliseconds);
}
....
}
→ Pull Request [14]
Предлагаем скачать анализатор PVS-Studio и попробовать проверить ваш проект:
Для снятия ограничения [19] демонстрационной версии, вы можете написать [20] нам, и мы отправим вам временный ключ.
Для быстрого знакомства с анализатором, вы можете воспользоваться утилитами, отслеживающими запуски компилятора и собирающие для проверки всю необходимую информацию. См. описание утилиты CLMonitoring [21] и pvs-studio-analyzer [22]. Если вы работаете с классическим типом проекта в Visual Studio, то всё ещё проще: достаточно выбрать в меню PVS-Studio команду «Check Solution».
Автор: PVS-Studio
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/248812
Ссылки в тексте:
[1] PVS-Studio: https://www.viva64.com/ru/pvs-studio/
[2] GCC: https://www.viva64.com/ru/b/0425/
[3] 1: https://www.viva64.com/ru/b/0108/
[4] 2: https://www.viva64.com/ru/b/0155/
[5] 3: https://www.viva64.com/ru/b/0446/
[6] Roslyn: https://www.viva64.com/ru/b/0363/
[7] презентация: https://www.slideshare.net/Andrey_Karpov/pvsstudio-static-code-analyzer-windowslinux-ccc-2017
[8] видео: https://www.youtube.com/watch?v=kmqF130pQW8&feature=youtu.be
[9] Статьи: https://www.viva64.com/ru/inspections/
[10] V3080: http://www.viva64.com/ru/w/V3080/
[11] Pull Request: https://github.com/dotnet/corefx/pull/16807
[12] V3019: http://www.viva64.com/ru/w/V3019/
[13] V3095: http://www.viva64.com/ru/w/V3095/
[14] Pull Request: https://github.com/Microsoft/msbuild/pull/1829
[15] V3041: http://www.viva64.com/ru/w/V3041/
[16] V3118: http://www.viva64.com/ru/w/V3118/
[17] PVS-Studio для Windows: https://www.viva64.com/ru/pvs-studio-download/
[18] PVS-Studio для Linux: https://www.viva64.com/ru/pvs-studio-download-linux/
[19] ограничения: https://www.viva64.com/ru/m/0009/
[20] написать: https://www.viva64.com/ru/about-feedback/
[21] CLMonitoring: https://www.viva64.com/ru/m/0031/
[22] pvs-studio-analyzer: https://www.viva64.com/ru/m/0036/
[23] Источник: https://habrahabr.ru/post/323646/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.