<div dir="ltr">Hi folks,<br><br>If this is not the correct mailing list for this question, please let me know.<br><br>I am trying to write a static analyzer for code base of my current job. The particular static analyzer I am writing involves a particular class of my company's code base. Let's say it is T. I want to write a checker to ensure T.ok() is called before T.value() is called.<br><br>Static analyzer is perfect for this type of check as it requires path sensitive checks. When I trying to write the checker, I basically checks for pre-call and post-call. I want to tell if a CallEvent is T.ok() and T.value(). Currently what I am doing is:<br>1. From CallEvent, I cast to CXXMemberCall, and getOriginExpr(), then call getMethodDecl().<br>2. From CXXMethodDecl, I first call getThisType(), then call getAsCXXRecordDecl(), then getQualifiedNameAsString(), and compare with qualified name of T, to make sure it is member of T.<br>3. From CXXMethodDecl, I call getNameAsString() to get the method name, and compare them with "ok" and "value".<br><br>It works, but it looks complicated, and involves string comparison, which I assume is slow. Is there a easier way, blessed by clang static analyzer official teams, that tell if a MethodDecl, or CXXRecordDecl, is the function or class I am interested in?<br><br>The ideal way is, there is one-time call to lookup the MethodDecl for T::ok() and T::value(), and CXXRecordDecl for T. Then ever since then, I just need to compare the pointers.<br><br>Another way is, the first time I found it is T, T::ok() or T::value(), I save the pointer of CXXRecordDecl or MethodDecl, and use the pointers later. Is this the reliable (assume I use the pointer canonical decl will not change) and blessed way to do it? If it is, is my steps above the correct and simplest way to determine it is T::ok or T::value? Is there some better and more reliable way?<br><br>Thanks.<br></div>