Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Эксперимент по поиску ошибок в коде C# …

Эксперимент по поиску ошибок в коде C# компонентов Tizen

29 Июн 2017

Недавно ко мне обратился мой коллега, Андрей Карпов, с просьбой попробовать найти 3-4 ошибки в коде компонентов Tizen на языке C#. Сам он не так давно занимался анализом Tizen на предмет поиска ошибок в C/C++ коде и сейчас пишет несколько статей на эту тему. Вдохновлённый его примером, я провёл эксперимент по поиску ошибок в C# компонентах Tizen. Сразу скажу, что эксперимент прошел удачно, и в дальнейшем я займусь написанием большой статьи на эту тему, а сейчас просто поделюсь результатами пробной проверки.

0518_Tizen_Cs_ru/image1.png

Для начала я не стал проводить глубокий анализ всей базы исходного кода Tizen, а выбрал пару проектов на языке C#, проверка которых не потребовала бы особых усилий. Цель нашего эксперимента – постараться понять, нужно ли работать в этом направлении.

В результате даже такой поверхностной проверки мне довольно быстро удалось найти несколько реальных ошибок, что позволяет утверждать: здесь есть работа для C# анализатора PVS-Studio. В данной короткой заметке я ограничусь описанием этих ошибок, оставив более подробное изучение данного вопроса на будущее.

По моим подсчётам, код Tizen содержит 4 929 файлов исходного кода с расширением cs, в которых имеется около 691 000 строк кода. Исходный код довольно объёмен и его полноценный анализ потребует некоторого времени. Позже, по результатам этой работы, я напишу развёрнутую статью.

Пока же приведу описание трёх из списка найденных мною на данном этапе работы ошибок. Для простоты я буду указывать имя папки верхнего уровня в иерархии проектов Tizen, где содержался файл с ошибкой.

xamarin-forms-tizen

PVS-Studio: V3001 There are identical sub-expressions 'RwWait' to the left and to the right of the '|' operator. Xamarin.Forms.Platform.WP8 SplitOrderedList.cs 458

struct SimpleRwLock
{
  const int RwWait = 1;
  const int RwWrite = 2;
  const int RwRead = 4;
  ....
  public void EnterReadLock()
  {
    var sw = new SpinWait();
    do
    {
      while ((_rwlock & (RwWrite | RwWait)) > 0)
        sw.SpinOnce();

      if ((Interlocked.Add(ref _rwlock, RwRead)
          & (RwWait | RwWait)) == 0)                // <=
        return;

      Interlocked.Add(ref _rwlock, -RwRead);
    } while (true);
  }
  ....
}

Вероятно, в условии блока if допущена опечатка, связанная с похожестью имен констант RwWait и RwWrite, в результате чего константа RwWait была ошибочно использована дважды. В пользу этого говорит и условие в блоке while выше, где используется правильное сочетание RwWrite | RwWait.

PVS-Studio: V3095 The 'type' object was used before it was verified against null. Check lines: 147, 149. Xamarin.Forms.Xaml ExpandMarkupsVisitor.cs 147

CWE-476 NULL Pointer Dereference

public class MarkupExpansionParser : 
  MarkupExpressionParser, IExpressionParser<INode>
{
  ....
  public INode Parse(....)
  {
    ....
    Type type;
    ....
    var xmltype = new XmlType(namespaceuri, type.Name, null); // <=
   
    if (type == null)
      throw new NotSupportedException();
    ....
  }
  ....
}

Переменную type сначала используют для доступа к type.Name, а уже затем проверяют на равенство null. В результате возможно возникновение исключения типа NullReferenceException.

csapi-location

PVS-Studio. V3110 Possible infinite recursion inside 'Timestamp' property. Tizen.Location Location.cs 186

CWE-674 Uncontrolled Recursion

public class Location
{
  ....
  internal int _timestamp;
  ....
  public DateTime Timestamp
  {
    get
    {
        return Interop.ConvertDateTime(_timestamp);
    }
    internal set
    {
        Timestamp = value;             // <=
    }
  }  
  ....
}

Данный фрагмент кода содержит ошибку, неизбежно приводящую к исчерпанию стека (бесконечная рекурсия) при попытке доступа на запись к свойству Timestamp. При этом нет видимых признаков опечатки. Поле _timestamp значительно отличается по написанию от Timestamp, так что непохоже, что их могли перепутать. К тому же, _timestamp имеет тип int, что делает невозможным прямое присвоение ему значения value типа DateTime. Потребовалось бы преобразование типа, наподобие того, что реализовано в секции get. Думаю, исправить данную ошибку смог бы только автор.

Думаю, для начала достаточно, остальные ошибки, найденные на этом этапе, я приберегу для следующей статьи.

Можно сделать вывод, что анализатор PVS-Studio может быть использован не только для проверки C и C++ кода, но и для проверки компонентов, разработанных на C#.

Скачать и попробовать PVS-Studio: http://www.viva64.com/ru/pvs-studio/

Дополнительные ссылки:

Популярные статьи по теме
Сортировки в C#: OrderBy.OrderBy или OrderBy.ThenBy? Разбираемся, что эффективнее и почему

Дата: 20 Сен 2022

Автор: Сергей Васильев

Предположим, есть задача: нужно отсортировать коллекцию по нескольким ключам. В C# это можно сделать с помощью вызовов OrderBy().OrderBy() или OrderBy().ThenBy(). Но в чём разница между этими вызовам…
ML.NET: можно ли доверять машинному обучению Microsoft?

Дата: 08 Сен 2022

Автор: Андрей Москалёв

В 2018 году Microsoft разработали ML.NET – фреймворк машинного обучения для .NET разработчиков. За прошедшее время эта библиотека претерпела существенные изменения и обзавелась новыми функциями для в…
Чем опасны уязвимые зависимости в проекте и как с этим помогает SCA?

Дата: 06 Сен 2022

Автор: Никита Липилин

Современные приложения почти всегда используют сторонние библиотеки. Если библиотека содержит уязвимость, то уязвимым может оказаться и использующее её приложение. Но как определить наличие таких про…
Соберёмся? Вторая проверка проекта MSBuild

Дата: 01 Сен 2022

Автор: Никита Паневин

MSBuild – популярная сборочная платформа с открытым исходным кодом от Microsoft, которую используют разработчики по всему миру. В далёком 2016 году мы уже проверяли проект при помощи PVS-Studio и наш…
Триквел по Orchard Core. Повторная проверка при помощи PVS-Studio

Дата: 25 Авг 2022

Автор: Алексей Авдеев

В этой статье мы исследуем проект Orchard Core c помощью статического анализатора PVS-Studio и узнаём, так ли привлекателен код платформы, как сайты, созданные на её основе. Итак, пусть поток статиче…

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно. Хотите узнать подробнее?
Принять