Да, существуют программные способы обнаружения условий, которые вас беспокоят.
Мне кажется, в идеале вы хотите, чтобы инструмент статического анализа проверял, что предварительно обработанная версия кода:
- Не вызывает никаких функций, кроме тех, которые он определяет, и функций, не относящихся к вводу / выводу, в стандартной библиотеке,
- Ничего плохого не делает с указателями.
Путем предварительной обработки вы избавляетесь от проблемы обнаружения макросов, содержимого, возможно, плохого макроса, и фактического использования макросов. Кроме того, вы не хотите разбираться со всеми определениями макросов в стандартных заголовках C; они повредят вашу душу из-за всей исторической лжи, которую они содержат.
Если код вызывает только свои собственные функции и доверенные функции в стандартной библиотеке, он не вызывает ничего неприятного. (Примечание: это может быть вызов некоторой функции через указатель, поэтому для этой проверки требуется либо анализ точек на функцию, либо соглашение о том, что косвенные вызовы функций верботенны, что на самом деле, вероятно, целесообразно для кода, выполняющего численный анализ).
Цель проверки на наличие плохих вещей с помощью указателей состоит в том, чтобы они не злоупотребляли указателями для изготовления вредоносного кода и передачи ему контроля. Во-первых, это означает, что «нет указателей на целочисленные значения», потому что вы не знаете, где находится int: -}
Для проверки «кто делает вызов» необходимо проанализировать код и имя / тип, определить каждый символ, а затем проверить сайты вызовов, чтобы увидеть, куда они направляются. Если вы разрешите указатели / указатели функций, вам потребуется полный анализ точек.
Одна из компаний-разработчиков стандартных статических анализаторов (Coverity, Klocwork), вероятно, предоставляет какой-то метод ограничения функций, которые может вызывать блок кода. Если это не сработает, вам придется воспользоваться более общими механизмами анализа, такими как DMS Software Reengineering Toolkit
с C Front End . DMS предоставляет настраиваемый механизм для создания произвольных статических анализаторов для описания языка, предоставляемого ему в качестве внешнего интерфейса. DMS может быть настроен на выполнение именно теста 1), включая этап предварительной обработки; он также имеет полные точки и функциональные точки для анализаторов, которые можно использовать для проверки точек.
Для 2) «не использует указатели злонамеренно», опять же, стандартные компании-разработчики статического анализа предоставляют некоторую проверку указателей. Однако здесь у них гораздо более сложная проблема, поскольку они статически пытаются рассуждать о машине Тьюринга. Их решение - либо пропустить дела, либо сообщить о ложных срабатываниях. Наш инструмент CheckPointer представляет собой динамический анализ, то есть он отслеживает код во время его выполнения и, если есть какая-либо попытка злоупотребить указателем, CheckPointer немедленно сообщит о месте нарушения. О, да, CheckPointer вне закона переводит целочисленные значения в указатели: -} Таким образом, CheckPointer не будет предоставлять статическую диагностику «этот код может обмануть», но вы получите диагностику, если он действительно попытается обмануть. У CheckPointer довольно высокие накладные расходы (все эти проверки стоят чего-то), поэтому вы, вероятно, захотите некоторое время запустить свой код с ним, чтобы обрести уверенность в том, что ничего плохого не произойдет, и затем прекратите его использовать.
РЕДАКТИРОВАТЬ: Другой плакат говорит: Вы не можете ничего сделать с перезаписью буферов для статически определенных буферов . CheckPointer будет выполнять эти тесты и многое другое.