Качество кода CMake
От: jul_nevermind  
Дата: 05.09.19 08:07
Оценка: -3
CMake (от англ. cross-platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, а лишь генерирует файлы управления сборкой из файлов CMakeLists.txt.

Недавно проект проверили разработчики статического анализатора и написали об этом статью. Прежде, чем прочитать ее, сможете сказать, что не так в этом коде?

static int64_t
expand(struct archive_read *a, int64_t end)
{
  ....
  if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
    goto bad_data;
  if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
    goto bad_data;
  if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
    goto bad_data;
  len = lengthbases[lensymbol] + 2;
  if (lengthbits[lensymbol] > 0) {
    if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
      goto truncated_data;
    len += rar_br_bits(br, lengthbits[lensymbol]);
    rar_br_consume(br, lengthbits[lensymbol]);
  }
  ....
}


Ответ и другие примеры кода есть в статье.
c++ программирование статический анализ анализатор код ошибка
Re: Качество кода CMake
От: vopl Россия  
Дата: 05.09.19 08:15
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>CMake (от англ. cross-platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, а лишь генерирует файлы управления сборкой из файлов CMakeLists.txt.


_>Недавно проект проверили разработчики статического анализатора и написали об этом статью. Прежде, чем прочитать ее, сможете сказать, что не так в этом коде?


_>
_>static int64_t
_>expand(struct archive_read *a, int64_t end)
_>{
_>  ....
_>  if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
_>    goto bad_data;
_>  if (lensymbol >=?? (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
_>    goto bad_data;
_>  if (lensymbol >=?? (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
_>    goto bad_data;
_>  len = lengthbases[lensymbol] + 2;
_>  if (lengthbits[lensymbol] > 0) {
_>    if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
_>      goto truncated_data;
_>    len += rar_br_bits(br, lengthbits[lensymbol]);
_>    rar_br_consume(br, lengthbits[lensymbol]);
_>  }
_>  ....
_>}

_>


разыменование массивов по индексу, равному размеру массива?
Re[2]: Качество кода CMake
От: jul_nevermind  
Дата: 05.09.19 09:28
Оценка:
Здравствуйте, vopl, Вы писали:

V>Здравствуйте, jul_nevermind, Вы писали:


_>>CMake (от англ. cross-platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, а лишь генерирует файлы управления сборкой из файлов CMakeLists.txt.


_>>Недавно проект проверили разработчики статического анализатора и написали об этом статью. Прежде, чем прочитать ее, сможете сказать, что не так в этом коде?


_>>
_>>static int64_t
_>>expand(struct archive_read *a, int64_t end)
_>>{
_>>  ....
_>>  if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
_>>    goto bad_data;
_>>  if (lensymbol >=?? (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
_>>    goto bad_data;
_>>  if (lensymbol >=?? (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
_>>    goto bad_data;
_>>  len = lengthbases[lensymbol] + 2;
_>>  if (lengthbits[lensymbol] > 0) {
_>>    if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
_>>      goto truncated_data;
_>>    len += rar_br_bits(br, lengthbits[lensymbol]);
_>>    rar_br_consume(br, lengthbits[lensymbol]);
_>>  }
_>>  ....
_>>}

_>>


V>разыменование массивов по индексу, равному размеру массива?


Верно
Re: Качество кода CMake
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.09.19 10:58
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>CMake (от англ. cross-platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, а лишь генерирует файлы управления сборкой из файлов CMakeLists.txt.


_>Недавно проект проверили разработчики статического анализатора и написали об этом статью. Прежде, чем прочитать ее, сможете сказать, что не так в этом коде?


 if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
  goto bad_data;

 len = lengthbases[lensymbol] + 2;


Ответы я тоже не читал (не, таки заглянул )

Неправильная проверка ( > вместо >=) — это ладно.

А вот за приведение к (int) —

UPD. Тут еще вопрос к типу lensymbol ... а ну как он знаковый и значение lensymbol может быть отрицательным? Хотя да, туплю, вопрос снимается
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 05.09.2019 11:04 Коваленко Дмитрий . Предыдущая версия . Еще …
Отредактировано 05.09.2019 11:03 Коваленко Дмитрий . Предыдущая версия .
Re: Качество кода CMake
От: B0FEE664  
Дата: 05.09.19 12:29
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>CMake (от англ. cross-platform make) — это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. CMake не занимается непосредственно сборкой, а лишь генерирует файлы управления сборкой из файлов CMakeLists.txt.


Я так понял, что приведённый ниже код — это код не CMake, а код стороненей библиотеки libarchive.

_>Недавно проект проверили разработчики статического анализатора и написали об этом статью. Прежде, чем прочитать ее, сможете сказать, что не так в этом коде?


Кудряво пишут безработные выпусники Беркли.

_>
_>static int64_t
_>expand(struct archive_read *a, int64_t end)
_>{
_>  ....
_>  if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
_>    goto bad_data;
_>  if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
_>    goto bad_data;
_>  if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
_>    goto bad_data;
_>  len = lengthbases[lensymbol] + 2;
_>  if (lengthbits[lensymbol] > 0) {
_>    if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
_>      goto truncated_data;
_>    len += rar_br_bits(br, lengthbits[lensymbol]);
_>    rar_br_consume(br, lengthbits[lensymbol]);
_>  }
_>  ....
_>}
_>

_>Ответ и другие примеры кода есть в статье.

Я попробовал почитать код и мне кажется, что вот эти проверки:
 if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
    goto bad_data;
 if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
    goto bad_data;

вообще можно выкинуть или заменить на assert'ы, но гарантировать я это не могу, так как код очень труден для чтения.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.