[PATCH] D47135: [analyzer][WIP] A checker for dangling string pointers in C++

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon May 21 11:44:13 PDT 2018


NoQ added a comment.

This looks great, i think we should make a single super simple mock test and commit this.

@MTC, i really appreciate your help!



================
Comment at: lib/StaticAnalyzer/Checkers/DanglingStringPointerChecker.cpp:59
+  QualType RegType = TypedR->getValueType();
+  if (RegType.getAsString() != "std::string")
+    return;
----------------
MTC wrote:
> A little tip, there are other string types besides `std::string`, like `std::wstring`, which can be added in the future. See [[ http://en.cppreference.com/w/cpp/string/basic_string | basic_string ]].
Yup, the current check should work in many cases, but it should be better to compare the class name to `basic_string`.

I'm also worried about various sorts of `std::__1::string`s (an inline namespace in libc++).


================
Comment at: lib/StaticAnalyzer/Checkers/DanglingStringPointerChecker.cpp:64
+
+  if (Call.isCalled(CStrFn)) {
+    SymbolRef RawPtr = Call.getReturnValue().getAsSymbol();
----------------
It has long been planned to extend `isCalled` to C++ methods, i.e. something like this:
```
DanglingStringPointerChecker() : CStrFn("std::string::c_str") {}

...

void DanglingStringPointerChecker::checkPostCall(const CallEvent &Call,
                                                 CheckerContext &C) const {
  // Skip the class check.
  if (Call.isCalled(CStrFn)) {
    ...
  }

  ...
}
```
Still looking for volunteers^^


================
Comment at: lib/StaticAnalyzer/Checkers/DanglingStringPointerChecker.cpp:71
+
+  if (dyn_cast<CXXDestructorCall>(ICall)) {
+    if (State->contains<RawPtrMap>(TypedR)) {
----------------
MTC wrote:
> `CXXDestructorCall::classof(const CallEvent *CA)` can also be used here. 
`isa`.


================
Comment at: lib/StaticAnalyzer/Checkers/RegionState.h:18
+
+namespace region_state {
+
----------------
MTC wrote:
> I'm not sure whether `region_state` follows the naming conventions of LLVM coding standards. Can someone answer this question?
I think it does, cf. `namespace ast_matchers`.

The name should be more specific though, a lot of checkers track "region states". Maybe "allocation_state"?


Repository:
  rC Clang

https://reviews.llvm.org/D47135





More information about the cfe-commits mailing list