[llvm-bugs] [Bug 41463] New: false positive: Forming reference to null pointer after dynamic cast to this

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Apr 11 03:33:02 PDT 2019


            Bug ID: 41463
           Summary: false positive: Forming reference to null pointer
                    after dynamic cast to this
           Product: clang
           Version: 8.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Static Analyzer
          Assignee: dcoughlin at apple.com
          Reporter: Burlog at seznam.cz
                CC: dcoughlin at apple.com, llvm-bugs at lists.llvm.org

The code bellow emits this warning:

┣━ /tmp/ ❱ scan-build -o /tmp/report clang++ b.cc
scan-build: Using '/usr/lib64/llvm/8/bin/clang-8' for static analysis
b.cc:24:30: warning: Forming reference to null pointer
    throw std::runtime_error("error type: " + type);
1 warning generated.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/report/2019-04-11-122032-4644-1' to examine bug

┣━ /tmp/ ❱ cat b.cc

#include <map>
#include <iostream>
#include <memory>

struct V {
    V(std::string type): type(std::move(type)) {}
    virtual ~V() = default;
    virtual void some_method() = 0;
    template <typename T> T f();
    std::string type;

template <typename T>
struct R: public V {
    R(): V("R") {}
    void some_method() override {}
    T value;

template <typename T>
T V::f() {
    if (auto *res = dynamic_cast<R<T> *>(this))
        return res->value;
    throw std::runtime_error("error type: " + type);

struct C {
    struct E {V *values[2]; bool second_valid;};

    template <typename T>
    T get(const std::string &n) {
        auto ival = map.find(n);
        if (ival == map.end())
            throw std::runtime_error("error name: " + n);
        return ival->second.values[ival->second.second_valid]->f<T>();

    std::map<std::string, E> map;

int main(int, char *[]) {
    C c;
    C::E e;
    e.second_valid = false;
    e.values[0] = new R<int>();
    e.values[1] = new R<int>();
    c.map.emplace("r", e);
    std::cerr << c.get<int>("r") << std::endl;
    return EXIT_SUCCESS;

When the lines 22 and 23 are removed, the analyzer doesn't report any warning.
It looks like, that dynamic_cast of this confuses the analyzer.

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20190411/cbccd0a5/attachment.html>

More information about the llvm-bugs mailing list