Неопределенное поведение в Intel safestringlib - PullRequest
4 голосов
/ 23 сентября 2019

В Intel safestringlib есть открытая ошибка при неопределенном поведении в memcpy_s API, когда он сравнивает указатели (потенциально) различных выделенных объектов:

if( ((dp > sp) && (dp < (sp+smax))) ||
((sp > dp) && (sp < (dp+dmax))) )

Где dp и sp имеют uint8_t типы указателей, которые нарушают C11 § 6.5.8 параграф 5 [Выпуск (# 18): https://github.com/intel/safestringlib/issues/18 (статус: открыт)]

Теперь, я подозреваю, есть еще один UB в strncpy_s API :

   if (dest < src) {                        //HERE
       overlap_bumper = src;

dest и src являются char указателями, поэтому if (dest < src) сравниваетуказатели из разных выделенных объектов, как в ошибке memcpy_s (UB # 1).

Прав ли я с моим подозрением?

1 Ответ

2 голосов
/ 30 сентября 2019

Действительно, как упомянул @AlexLop, в библиотеке существует множество случаев такого рода неопределенного поведения.

Быстрый тест с Frama-C показывает некоторые случаи появления \pointer_comparable сигналов тревоги.Помимо прочего, эти аварийные сигналы указывают на использование операторов сравнения между различными объектами, например UB.

Например, при запуске следующей команды:

frama-c-gui safeclib/*.c unittests/test_strncpy_s.c -main test_strncpy_s \
  -cpp-extra-args="-Iinclude" -eva -eva-precision 3

Показывает ли в графическом интерфейсе, что естьнесколько стеков вызовов, в которых сравниваются указатели из str1 и str2 (хотя по крайней мере в одном стеков вызовов указатели указывают на одну и ту же глобальную переменную, поэтому в этом случае она действительна).

Screenshot of the Frama-C GUI showing the alarm and values computed by Eva, per callstack

...