Clang SA Checker Appartion `loc :: isloctype (type) 'Не удалосьC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Clang SA Checker Appartion `loc :: isloctype (type) 'Не удалось

Сообщение Anonymous »

Я пишу Clang Static Analyzer Checker для этого класса: < /p>

Код: Выделить всё

class A {
int member_;
public:
void set(const int& value);
const int& get();
};
< /code>
Реал -набор реализация Сохранения Сохранения передаваемого значения для внутренней переменной типа int, возвращает ссылку на эту переменную. < /p>
Это моя реализация: < /p>
#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"

using namespace clang;
using namespace ento;

namespace {

class checkerObjTest : public Checker {

bool handleSet(CheckerContext &C, const CallEvent &Call) const;

public:
bool evalCall(const CallEvent &Call, CheckerContext &C) const;

using FnHandler = bool (checkerObjTest::*)(CheckerContext &, const CallEvent &Call) const;
CallDescriptionMap Functions = {
{{{"set"}, 1}, &checkerObjTest::handleSet},
};
};

} // namespace

bool checkerObjTest::handleSet(CheckerContext &C, const CallEvent &Call) const {

const CallExpr *CE = dyn_cast_or_null(Call.getOriginExpr());
if (!CE)
return false;

const CXXInstanceCall *InstCall = dyn_cast(&Call);
if (!InstCall)
return false;

// Conversion to CXXThisExpr returns null in my example, conversion to
// Expr returns a valid pointer.
//const CXXThisExpr *TE =
dyn_cast_or_null(InstCall->getCXXThisExpr());
const Expr *TE = dyn_cast_or_null(InstCall->getCXXThisExpr());
if (!TE)
return false;

unsigned Count = C.blockCount();
SValBuilder &svalBuilder = C.getSValBuilder();
const LocationContext *LCtx = C.getPredecessor()->getLocationContext();

// Create memory region for object data
// Both of these calls trigger a Loc::isLocType(type) assertion.
DefinedSVal innerDataVal = svalBuilder.getConjuredHeapSymbolVal(TE, LCtx, Count).castAs();
//DefinedSVal innerDataVal = svalBuilder.getConjuredHeapSymbolVal(CE, LCtx, Count).castAs();

return true;
}

bool checkerObjTest::evalCall(const CallEvent &Call, CheckerContext &C) const {
const FnHandler *Handler = Functions.lookup(Call);
if (Handler) {
return (this->**Handler)(C, Call);
}
return false;
}

void ento::registercheckerObjTest(CheckerManager &mgr) {
mgr.registerChecker();
}

bool ento::shouldRegistercheckerObjTest(const CheckerManager &mgr) {
if (mgr.getLangOpts().CPlusPlus)
return true;
return false;
}
< /code>
На этом простом тесте < /p>
class A {
int member_;
public:
void set(const int& value);
const int& get();
};

int main()
{
A a;
int data = 0;
a.set(data);
int res = a.get();
return res;
}
clang сбои из -за утверждения в svalbuilder :: getConjuredHeapSymbolval :

Код: Выделить всё

Assertion `Loc::isLocType(type)' failed.
выглядит так, как будто двигатель ожидает, что первый аргумент GetConcureudHeapSymbolval будет место. Я пробовал выражения для Call и это , оба утверждая. работают. Может быть, этот метод неверен для моделирования внутренних состояний объектов, и есть правильный?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ype-failed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»