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]);
}
....
}
Ответ и другие примеры кода есть в статье.
Здравствуйте, 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]);
_> }
_> ....
_>}
_>
разыменование массивов по индексу, равному размеру массива?
Здравствуйте, 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>разыменование массивов по индексу, равному размеру массива?
Верно
Здравствуйте, 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 может быть отрицательным? Хотя да, туплю, вопрос снимается
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, 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'ы, но гарантировать я это не могу, так как код очень труден для чтения.