Как написать чекеры для поиска конкретных системных вызовов?

Я все еще новичок и изучаю способ написания чекеров для статического анализатора clang. Мне нужно сделать чекер на базе Linux, и я прочитал много материалов из блогов и сайтов, но почти все они основаны на Xcode, и ни один из них не говорит мне, как искать конкретный системный вызов.

Я пытаюсь написать программу проверки на Linux, которая может сообщить пользователям, что используемый ими системный вызов опасен, и показать причину, по которой это может быть утечка.

Может ли кто-нибудь сказать мне, возможно ли сделать такую ​​проверку? И если это можно сделать, как мне это сделать или где я могу найти эти материалы для этого?


person Annie Liao    schedule 12.03.2018    source источник


Ответы (1)


Это руководство Как написать средство проверки за 24 часа довольно информативно и включает в себя пример идентификации вызовов fopen вокруг 34-го слайда. Я настоятельно рекомендую ознакомиться с ним самостоятельно, но я постараюсь обобщить наиболее важные части, чтобы вы могли начать.

Каждая программа проверки регистрирует функции обратного вызова, которые вызываются для проверки определенных свойств. В вашем случае ваш чекер будет использовать функцию события вызова:

void checkPostCall(const CallEvent &Call, CheckerContext &C) const;

Эта функция-член в вашей программе проверки будет вызываться каждый раз, когда механизм статического анализатора сталкивается с событием вызова. Вам просто нужно определить свою функцию, чтобы проверить, относится ли событие вызова к системному вызову, который вы проверяете. В связанном примере они ищут вызовы fopen, поэтому начало их функции checkPostCall выглядит примерно так:

if(Call.isGlobalCFunction("fopen"))
    //do stuff

Надеюсь, этого достаточно, чтобы помочь вам начать работу!

person Community    schedule 17.03.2018